我正在尝试使用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的结果并没有给出我想要的格式!我做错了什么?
答案 0 :(得分:1)
我的理解是,B
几乎是您正在寻找的内容,除非您希望将包含userid
和day
的元组展平,并且您只希望行李中会显示pid
,fulldate
,x
和y
。
首先,您要展平包含字段group
和userid
的元组day
,而不是包含多个元组的包A
。展平group
会使元组不连续,每个行只有一组唯一值,而展平行李A
将有效取消组合您之前的GROUP BY
语句,因为行包中的值{{ 1}}不是唯一的。所以第一部分应该是A
接下来,您希望将C = FOREACH B GENERATE FLATTEN(group) AS (userid, day);
,pid
,fulldate
和x
保留在每个记录的单独元组中,但是您选择它们的方式如何基本上包含所有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)。