単純な結合のように見えることをしようとしている例があります。
A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d1:int, values:bag{(v:chararray)})} );
B = load 'data7' as ( v:chararray, r:chararray );
grunt> cat data1
'item1' 111 { ('thing1', 222, {('value1'),('value2')}) }
grunt> cat data2
'value1' 'result1'
'value2' 'result2'
のデータを'result1'
、明らかなフィールドでのエントリに結合したいと考えています。'result2'
data2
data1
value
それを平らにすることができました:
A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d1:int, values:bag{(v:chararray)})} );
B = load 'data7' as ( v:chararray, r:chararray );
F1 = foreach A generate item, d, flatten(things);
F2 = foreach F1 generate item..d1, flatten(values);
次に、2 番目のデータセットを結合しました。
J = join F2 by v, B by v
J1 = foreach J generate item as item, d as d, thing as thing, d1 as d1, F2::things::values::v as v, r as r; --Remove duplicate field & clean up naming
dump J1
('item1',111,'thing1',222,'value1','result1')
('item1',111,'thing1',222,'value2','result2')
ここで、アイテムごとに UDF 関数を 1 回呼び出す必要があるため、これら 2 つのレベルのバッグを再グループ化する必要があります。各項目には 0 個以上のものがあり、各ものには 0 個以上の値があり、その値は結果を持っている場合と持っていない場合があります。
どうすれば元に戻りますか:
('item1', 111, { 'thing1', 222, { ('value1, 'result1'), ('value2', 'result2') }
グループ化と再結合の試みはすべて複雑さが増し、正しい結果を生成できず、Hadoop では 1 つの mapreduce ジョブであるはずの 4 つ以上の mapreduce ジョブで実行されました。