1 つのデータ ソースとして値のリストと、値に関連付けられた範囲を含む 2 つ目のデータセットがあります。
Dataset 1:
3
4
6
20
25
38
Dataset 2:
1|3|A
4|10|B
11|20|C
21|30|D
31|31|E
32|38|F
39|40|G
Result:
3,A
4,B
6,B
20,C
25,D
38,F
データセット 1 の値をデータセット 2 の文字に結び付けるために、ある種の「JOIN」を作成したいと思います。
1 つのデータ ソースとして値のリストと、値に関連付けられた範囲を含む 2 つ目のデータセットがあります。
Dataset 1:
3
4
6
20
25
38
Dataset 2:
1|3|A
4|10|B
11|20|C
21|30|D
31|31|E
32|38|F
39|40|G
Result:
3,A
4,B
6,B
20,C
25,D
38,F
データセット 1 の値をデータセット 2 の文字に結び付けるために、ある種の「JOIN」を作成したいと思います。
主な問題は、MapReduce の結合方法ではキーが正確に一致する必要があり、(デフォルトでは) パーティショナーにランダムにバケット化されることです。Java MapReduce でこれを行うには、おそらくトリッキーな方法がたくさんあります。Pig で考えられる最も簡単な 2 つは以下のとおりです。どちらが速いかはわかりません...データの性質によって異なります。
外積を使用する:
C = CROSS A, B;
D = FILTER C BY $1 >= $2 AND $1 <= $3;
これは遅くなる可能性があります。しかし、それは仕事を成し遂げます!
範囲を爆破してから、結合を行います
B2 = FOREACH B GENERATE FLATTEN(explode_range_udf($1, $2, $3));
C = JOIN A by $1, B2 by $1;
explode_range_udf
ここで、3 つの値を取り、範囲内の可能な各要素を含むタプルのバッグを返すudf を記述します。例えば:
explode_range_udf(1,3,A) -> {(1,A),(2,A),(3,A)}
FLATTEN
バッグ内のアイテムごとに記録を作成します。