使用Pig Latin - Hadoop将元组插入内袋

时间:2018-04-23 15:29:45

标签: hadoop apache-pig apache-pig-grunt

我正在尝试使用Pig Latin创建以下关系格式:

userid,day,{(pid,fulldate,x,y),(pid,fulldate,x,y),...}

关系描述:每天(每天)的每个用户(用户ID)购买了多个产品(pid)

我正在将数据加载到:

A= LOAD '**from a HDFS URL**' AS (pid: chararray,userid: 
chararray,day:int,fulldate: chararray,x: chararray,y:chararray);
B= GROUP A BY (userid, day);
Describe B;

B:{group:(userid:chararray,day:int),A:{(pid:chararray,day:int,fulldate:chararray,x:chararray,userid:chararray,y:chararray)}}

C= FOREACH B FLATTEN(B) AS (userid,day), $1.pid, $1.fulldate,$1.x,$1.y;
Describe C;

C:{userid:chararray,day:int,{(pid:chararray)}},{(fulldate:chararray)},{(x:chararray)},{(y:chararray)}}

Describe C的结果并没有给出我想要的格式!我做错了什么?

2 个答案:

答案 0 :(得分:1)

我的理解是,B几乎是您正在寻找的内容,除非您希望将包含useridday的元组展平,并且您只希望行李中会显示pidfulldatexy

首先,您要展平包含字段groupuserid的元组day,而不是包含多个元组的包A。展平group会使元组不连续,每个行只有一组唯一值,而展平行李A将有效取消组合您之前的GROUP BY语句,因为行包中的值{{ 1}}不是唯一的。所以第一部分应该是A

接下来,您希望将C = FOREACH B GENERATE FLATTEN(group) AS (userid, day);pidfulldatex保留在每个记录的单独元组中,但是您选择它们​​的方式如何基本上包含所有y值,一包所有pid值等等。相反,请尝试选择这些字段,使元组嵌套在包中:

fulldate

答案 1 :(得分:1)

GROUP BY部分之前你是正确的。在那之后,你正试图做一些凌乱的事情。我实际上不确定您的别名C发生了什么。要获得您正在寻找的格式,您需要一个嵌套的foreach。

C = FOREACH B {
         data = A.pid, A.fulldate, A.x, A.y;
         GENERATE FLATTEN(group), data;
    }

这允许C为每个(userid, day)创建一条记录,并在一个包中包含所有相应的(pid,fulldate, x, y)元组。 您可以在此处阅读有关嵌套foreach的更多信息:https://www.safaribooksonline.com/library/view/programming-pig/9781449317881/ch06.html(在该链接中搜索嵌套的foreach)。