首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pig:如何在嵌套包中连接键上的数据

Pig:如何在嵌套包中连接键上的数据
EN

Stack Overflow用户
提问于 2013-05-23 18:23:36
回答 2查看 1.4K关注 0票数 3

我只是尝试在data1data2中看到的'value1'/'value2'键上合并从data2data1的值(请注意

很简单,对吧?在面向对象的代码中,它是一个嵌套的for循环。但在Pig中,这感觉就像是在解rubix立方体。

代码语言:javascript
运行
复制
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来自面向对象的数据存储,它解释了双重嵌套(简单的面向对象格式)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-25 07:17:42

听起来你基本上只是想做一个连接(从问题中不清楚这应该是内部的,左的,右的还是全的。我认为@SNeumann基本上已经有了书面答案,但我将添加一些代码以使其更清晰。

假设数据如下:

代码语言:javascript
运行
复制
data1 = 'item1'     111     { ('thing1', 222, {('value1'),('value2')}) }
        ...
data2 = 'value1'    'result1'
        'value2'    'result2'
        ...

我会做这样的事情(未测试的):

代码语言:javascript
运行
复制
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从未计划在该包中包含多个项目,我强烈建议使用元组,并加载为:

代码语言:javascript
运行
复制
A = load 'data1' as (item:chararray, d:int, things:(thing:chararray, d1:int, values:bag{(v:chararray)})); 

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

如果包是绝对必需的,那么整个问题就会改变,当包中有多个things对象时,就不清楚OP想要发生什么了。正如here所指出的,Bag投影也要复杂得多

票数 3
EN

Stack Overflow用户

发布于 2013-05-23 20:14:30

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16711420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档