假设我在file.txt中设置了值
A,B,C
A,B,d
K,L,M
K,L,N
K,L,O
我的代码是:
file = LOAD'file.txt'使用PigStorage(',');
events = foreach文件生成session_id,user_id,代码,类型;
gr =组事件(session_id,user_id);
我有一套价值:
((A,B),{(A,B,C),(A,B,d)})
((K,L),{(K,L,M),(K,L,N),(K,L,O)})
我想要:
(A,B,(C,d))
(K,L,(M,N,O))
你知道怎么做吗?
此致 的Pawel
答案 0 :(得分:3)
注意:您的问题不一致。您在session_id, user_id, code, type
行中说FOREACH
,但您的PigStorage没有提供值。此外,FOREACH
有4个值,而您的示例数据只有3.我会假设type
不存在,以便回答您的问题。
在您的gr
关系之后,您将在一个名为(session_id, user_id)
的自动生成的元组中按键分组(在本例中为group
)。
所以,第一步:gr2 = FOREACH gr GENERATE FLATTEN(group);
这将为您提供元组(a,b)
和(k,l)
。您需要使用FLATTEN
,因为group
是一个元组,并且您要求session_id
和user_id
为单独的列。 FLATTEN
为你做到了。
好的,现在修改gr2
行也使用投影来梳理第三个值:
gr2 = FOREACH gr GENERATE FLATTEN(group), events.code;
events.code
在所有code
值中创建包。 events
是分组元组的名称(它以原始关系命名)。
这应该给你:
(a, b, {c, d})
(k, l, {m, n, o})
非常重要的是要注意列表中的值是一个包而不是元组,就像你要求的那样。将它放在包里是正确的想法,因为包是一个变量列表,而元组则不是。
其他建议:了解GROUP BY
输出数据的方式是我看到很多人在第一次使用Pig时遇到的问题。如果您认为我的答案没有多大意义,我建议您花些时间真正理解GROUP BY
。从长远来看,理解与思考它是神奇的回报。