如何在猪中使用FLATTEN一个级别?

时间:2015-12-21 17:59:32

标签: tuples apache-pig bag

问题

我有一个由嵌套元组组成的内袋,对于我预期的架构是不必要的。我想删除其中一个元组层,这样我只剩下一个简单的内袋。我正在使用Pig 0.14。

实施例

我的输入数据样本。

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

我想要的输出。

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

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

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

的尝试

我觉得我的并发症是我正在尝试对元组内的项目进行分组。我做了一个简单的组声明,似乎将分组元素保留在元组中(我对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),以便删除ab作为一个组使用,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)})

我错过了什么?

1 个答案:

答案 0 :(得分:1)

你可以试试这个。这有点帮助...但这不是一个有效的解决方案。让我们等一些好脑来发布他们的答案。

输入:

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

Pig Script:

 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)})