Apache pig Pig:如何将密钥上的数据连接到嵌套包中

Apache pig Pig:如何将密钥上的数据连接到嵌套包中,apache-pig,Apache Pig,我只是尝试在data1和data2中看到的'value1'/'value2'键上,合并从data2到data1的值(注意 很简单,对吧?在面向对象的代码中,它是一个嵌套的for循环。但在Pig中,它感觉就像是在解决一个rubix多维数据集 data1 = 'item1' 111 { ('thing1', 222, {('value1'),('value2')}) } data2 = 'value1' 'result1' 'value2' 'result

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

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

听起来您基本上只想进行连接(从问题中不清楚这应该是内部的、左侧的、右侧的还是完整的)。我认为@SNeumann基本上有编写答案,但我将添加一些代码以使其更清楚

假设数据如下所示:

data1 = 'item1'     111     { ('thing1', 222, {('value1'),('value2')}) }
        ...
data2 = 'value1'    'result1'
        'value2'    'result2'
        ...
我会做一些类似(未经测试)的事情:

从这里开始,无论你喜欢什么,重新标记都应该是微不足道的

EDIT:上面应该使用“.”作为元组上的投影运算符。我已经将其切换到了。它还假设
things
是一个大元组,而不是。它是一个包含一个项目的包。如果OP从未计划在该包中包含多个项目,我强烈建议使用元组,并作为以下内容加载:

A = load 'data1' as (item:chararray, d:int, things:(thing:chararray, d1:int, values:bag{(v:chararray)})); 
然后按原样使用其余的代码(注意:仍然未测试)


如果一个包是绝对需要的,那么整个问题就会发生变化,当包中有多个
东西
对象时,OP想要发生什么就变得不清楚了。正如前面提到的,包的投影也相当复杂

当我试图将整个东西重新分组2级时,我会让它再旋转一次,感觉就像一只rubix幼兽e来解决问题。我没有玩过TOBAG,也不太熟悉它,所以我会仔细阅读,也许这就是我丢失的关键。这非常有用,当你将“things::values”展平时,我们尝试将(things.values)展平,但没有成功我认为那是不可能的。我知道你可以用::,不,“.”操作符引用到一个包中。非常感谢你的代码示例,它对我们帮助很大。我对“::”的用法感到困惑。我尝试使用它时出现了错误,我发布了另一个问题,答案建议我使用“:”符号,而不是“:”。我正在努力总结我的想法如果我尝试使用“.”,而不是“::”)的第一行,我会得到这个输出,我不理解:A_flatted:{item:chararray,d:int,thing:{(thing:chararray)},d1:{(d1:int)},value:{(v:chararray)}“.”符号是正确的。正如我所说,我的脚本未经测试。我只是想给你一个基本的想法。你遇到奇怪的投影的原因是,
东西
是一个袋子,所以任何投影在上面也会导致一个袋子。我用更多的信息编辑了我的答案。
A = load 'data1' as (item:chararray, d:int, things:(thing:chararray, d1:int, values:bag{(v:chararray)}));