我只是尝试在data1
和data2
中看到的'value1'/'value2'
键上合并从data2
到data1
的值(请注意
很简单,对吧?在面向对象的代码中,它是一个嵌套的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来自面向对象的数据存储,它解释了双重嵌套(简单的面向对象格式)。
发布于 2013-05-25 07:17:42
听起来你基本上只是想做一个连接(从问题中不清楚这应该是内部的,左的,右的还是全的。我认为@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所指出的,Bag投影也要复杂得多
发布于 2013-05-23 20:14:30
我会尝试将包含值(1,2)的A中的包展平,与B连接(内部、外部,无论您想要什么),然后再次分组并使用TOBAG投影所需的结构,等等。
https://stackoverflow.com/questions/16711420
复制相似问题