2

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」を作成したいと思います。

4

2 に答える 2

3

主な問題は、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バッグ内のアイテムごとに記録を作成します。

于 2013-04-19T01:23:45.997 に答える