Pig:如何在嵌套包中的密钥上加入数据

时间:2013-05-23 10:23:36

标签: apache-pig

我只是想在data2data1中看到的'value1'/'value2'键上合并data1data2的值(注意嵌套结构

容易对吗?在面向对象的代码中,它是一个嵌套的for循环。但在Pig中,感觉就像解决了一个rubix立方体。

data1 = 'item1'     111     { ('thing1', 222, {('value1'),('value2')}) }
data2 = 'value1'    'result1'
        'value2'    'result2'

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

expected: 'item1', 111, {('thing1', 222, {('value1','result1'), ('value2','result2')})}
                                           ^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^

对于好奇:data1来自面向对象的数据存储区,它解释了双嵌套(简单的面向对象格式)。

2 个答案:

答案 0 :(得分:3)

听起来你基本上只是想做一个连接(不清楚问题是否应该是INNER,LEFT,RIGHT或FULL。我认为@SNeumann基本上有写答案,但我会添加一些代码让它更清楚。

假设数据如下:

data1 = 'item1'     111     { ('thing1', 222, {('value1'),('value2')}) }
        ...
data2 = 'value1'    'result1'
        'value2'    'result2'
        ...

我会做(未经测试的):

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 );
A_flattened = FOREACH A GENERATE item, d, things.thing AS thing; things.d1 AS d1, FLATTEN(things.values) AS value;
--This looks like:
--'item1', 111, 'thing1', 222, 'value1'
--'item1', 111, 'thing1', 222, 'value2'
A_B_joined = JOIN A_flattened BY value, B BY v;
--This looks like:
--'item1', 111, 'thing1', 222, 'value1', 'value1', 'result1'
--'item1', 111, 'thing1', 222, 'value1', 'value2', 'result2'
A_B_joined1 = FOREACH A_B_JOINED GENERATE item, d, thing, d1, A_flattened::value AS value, r AS result;
A_B_grouped = GROUP A_B_joined1 BY (value, result);

从那里开始,你喜欢的反叛应该是微不足道的。

编辑:上面应该使用'。'作为元组的投影算子。我已经改变了它。它还假设things是一个大元组,它不是。这是一个项目袋。如果OP从未计划在该包中有多个项目,我强烈建议使用元组代替并加载为:

A = load 'data1' as (item:chararray, d:int, things:(thing:chararray, d1:int, values:bag{(v:chararray)})); 

然后按原样使用其余代码(注意:仍然未经测试)。

如果绝对需要一个包,则整个问题会发生变化,当包中有多个things个对象时,OP会发生什么变得不清楚。如所提到的here

,行李投影也相当复杂

答案 1 :(得分:2)

我试图在包含值(1,2)的A中展平包,与B结合(内部,外部,无论你在追求什么),然后再次分组并使用TOBAG等投影所需的结构。