如何在 Pig 中将 FLATTEN 用于一个级别?
How to use FLATTEN for one level in Pig?
问题
我有一个由嵌套元组组成的内包,这些元组对于我的预期架构来说是不必要的。我想删除其中一个元组层,这样我只剩下一个简单的内袋。我正在使用 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.;
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 [=14=];
这仍然没有真正提供我想要的,因为它保留了密钥:
(100,{(100,2),(100,3,500,60)})
我错过了什么?
你可以试试这个。这会有点帮助..但这不是一个有效的解决方案。让我们等待一些聪明的大脑 post 他们的答案。
输入:
(1,100,0)|(2)
(1,100,1)|(3,500,60)
猪脚本:
records = LOAD '/home/user/bags.txt' USING PigStorage('|') AS(key:tuple(),value:tuple());
records_each = FOREACH records GENERATE key. as grouping_key, flatten(value);
records_grp = GROUP records_each BY [=11=];
records_nested_each = FOREACH records_grp
{
inner_each= FOREACH records_each GENERATE ..;
GENERATE group, inner_each;
};
dump records_nested_each;
输出:
(100,{(2),(3,500,60)})
问题
我有一个由嵌套元组组成的内包,这些元组对于我的预期架构来说是不必要的。我想删除其中一个元组层,这样我只剩下一个简单的内袋。我正在使用 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.;
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 [=14=];
这仍然没有真正提供我想要的,因为它保留了密钥:
(100,{(100,2),(100,3,500,60)})
我错过了什么?
你可以试试这个。这会有点帮助..但这不是一个有效的解决方案。让我们等待一些聪明的大脑 post 他们的答案。
输入:
(1,100,0)|(2)
(1,100,1)|(3,500,60)
猪脚本:
records = LOAD '/home/user/bags.txt' USING PigStorage('|') AS(key:tuple(),value:tuple());
records_each = FOREACH records GENERATE key. as grouping_key, flatten(value);
records_grp = GROUP records_each BY [=11=];
records_nested_each = FOREACH records_grp
{
inner_each= FOREACH records_each GENERATE ..;
GENERATE group, inner_each;
};
dump records_nested_each;
输出:
(100,{(2),(3,500,60)})