我只是想在data2
和data1
中看到的'value1'/'value2'
键上合并data1
到data2
的值(注意嵌套结构
容易对吗?在面向对象的代码中,它是一个嵌套的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来自面向对象的数据存储区,它解释了双嵌套(简单的面向对象格式)。
答案 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等投影所需的结构。