如何在pig中使用一个级别的flatten?

gcxthw6b  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(535)

问题

我有一个由嵌套元组组成的内部包,这些元组对于我期望的模式是不必要的。我想去掉一个元组层,这样我只剩下一个简单的内袋。我用的是Pig0.14。

示例

我输入数据的样本。

((1,100,0),(2))
((1,100,1),(3,500,60))

我想要的输出。

(100,{(2),(3,500,60)})

我目前的状态经过一些小的操作(见下文),这引发了上述问题。

(100,{((2)),((3,500,60))})

尝试

我觉得我的复杂之处在于,我试图对元组中的一个项进行分组。我做了一个简单的group语句,它似乎将分组的元素保留在tuple中(我对pig相当陌生)。

a = LOAD 'data' as (key:tuple(), data:tuple());
b = GROUP a BY key.$1;
c = FOREACH b GENERATE group as vid, b.data as data;

倾倒 c 提供上述不需要的输出。多部件键 (a,b,c) 需要脱光衣服 a 被移除, b 作为一个组使用,并且 c 可以删除或不删除,但只有在它被用来创建内袋。
试图 FLATTEN 解组元素。那我就可以了 FLATTEN 一次又一次地分组,但这似乎有点可笑。有比这更好的办法吗?

d = FOREACH c GENERATE vid, FLATTEN(data) as data;
e = FOREACH d GENERATE vid, FLATTEN(data);
f = GROUP e BY $0;

这仍然不能真正提供我想要的,因为它保留了钥匙:

(100,{(100,2),(100,3,500,60)})

我错过了什么?

hc2pp10m

hc2pp10m1#

你可以试试这个。这会有点帮助。。但这不是一个有效的解决办法。让我们等待一些好的大脑发布他们的答案。
输入:

(1,100,0)|(2)
 (1,100,1)|(3,500,60)

Pig脚本:

records = LOAD '/home/user/bags.txt'  USING PigStorage('|')  AS(key:tuple(),value:tuple());

 records_each = FOREACH records GENERATE key.$1 as grouping_key, flatten(value);

 records_grp = GROUP records_each BY $0;

 records_nested_each = FOREACH records_grp

                      {
                        inner_each=   FOREACH records_each GENERATE $1..;

                         GENERATE group, inner_each;

                     };

 dump records_nested_each;

输出:

(100,{(2),(3,500,60)})

相关问题