猪:如何压扁&在袋子里重新加入袋子

时间:2013-06-06 00:08:54

标签: hadoop apache-pig

我有一个例子,我们试图做一个看似简单的连接:

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'的{​​{1}},'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);

现在我们需要为每个项目调用一次UDF函数,因此我们需要重新分组这两个级别的行李。每个项目有0个或更多的东西,每个东西都有0个或更多的值,现在这些值可能有也可能没有结果。

我们如何回到:

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

我在分组和重新加入时的所有尝试都变得复杂,无法产生正确的结果,并且在4+ mapreduce作业中运行应该是Hadoop中的1 mapreduce工作。

1 个答案:

答案 0 :(得分: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;