3

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

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

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 来自一个面向对象的数据存储,它解释了双重嵌套(简单的面向对象格式)。

4

2 回答 2

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所述,袋子投影也相当复杂

于 2013-05-24T23:17:41.810 回答
2

我会尝试将包含值 (1,2) 的 A 中的包展平,与 B 连接(内部、外部、无论您要追求什么),然后再次分组并使用 TOBAG 等投影所需的结构。

于 2013-05-23T12:14:30.393 回答