如何在Pig(Hadoop)中的组函数之后创建一组值

时间:2013-10-18 14:48:19

标签: hadoop apache-pig

假设我在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

1 个答案:

答案 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_iduser_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。从长远来看,理解与思考它是神奇的回报。