1

単純な結合のように見えることをしようとしている例があります。

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'data2data1value

それを平らにすることができました:

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 ジョブで実行されました。

4

1 に答える 1

1

次のコードは機能する可能性があり、R2 が最終結果です。

group_by_item_d_thing_d1 = group J1 by item, d, thing, d1;
R1 = foreach group_by_item_d_thing_d1 generate group.item, group.d, group.thing, group.d1, J1;
group_by_item_d = group R1 by item, d;
R2 = foreach group_by_item_d generate group.item, group.d, R1;
于 2013-06-06T05:27:32.183 に答える