3

假设我在 file.txt
a,b,c
a,b,d
k,l,m
k,l,n
k,l,o中有一组值

我的代码是:
file = LOAD 'file.txt' using 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))

你知道怎么做吗?

问候帕维尔

4

1 回答 1

3

注意:您的问题不一致。您在线上说session_id, user_id, code, typeFOREACH但是您的 PigStorage 不提供值。此外,它FOREACH有 4 个值,而您的示例数据只有 3 个。我假设它type不存在以回答您的问题。


在您的gr关系之后,您将(session_id, user_id)在一个名为group.

所以,第一步:gr2 = FOREACH gr GENERATE FLATTEN(group); 这会给你元组(a,b)(k,l). 您需要使用FLATTEN因为group是一个元组,并且您要求session_iduser_id成为单独的列。FLATTEN为你做。

好的,所以现在修改该gr2行以也使用投影来梳理出第三个值:

gr2 = FOREACH gr GENERATE FLATTEN(group), events.code;

events.code从所有值中创建一个包。是分组元组包的名称(它以原始关系命名)。codeevents

这应该给你:

 (a, b, {c, d})
 (k, l, {m, n, o})

非常重要的是要注意列表中的值是在一个包而不是一个元组中,就像你要求的那样。将它保存在包中是正确的想法,因为包是一个变量列表,而元组不是。


附加建议:了解如何GROUP BY输出数据是我看到很多人在第一次使用 Pig 时遇到的问题。如果您认为我的回答没有多大意义,我建议您花一些时间真正了解GROUP BY. 从长远来看,理解与认为它是魔法会得到回报。

于 2013-10-18T15:00:44.513 回答