我正在尝试使用pig拉丁语创建以下关系格式:
userid,day,{(pid,fulldate,x,y),(pid,fulldate,x,y),…}
关系描述:每天每个用户(userid)购买了多个产品(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)}
描述c的结果没有给出我想要的格式!我做错了什么?
2条答案
按热度按时间zvokhttg1#
我的理解是
B
几乎就是你要找的,除了你希望元组包含userid
以及day
你只想pid
,fulldate
,x
,和y
出现在袋子里。首先,您要展平元组
group
其中有字段userid
以及day
,不是包A
它包含多个元组。压扁group
unnests元组,每行只有一组唯一的值,而将包展平A
会有效地将你以前的GROUP BY
声明,因为包中的值A
不是唯一的。所以第一部分应该是C = FOREACH B GENERATE FLATTEN(group) AS (userid, day);
下一步,你想保持pid
,fulldate
,x
,和y
在每个记录中使用不同的元组,但您选择它们的方式实际上是将所有pid
价值观,一袋所有的fulldate
值等。请尝试以使元组嵌套在包中的方式选择这些字段:ckx4rj1h2#
你是对的,直到
GROUP BY
部分。然而,在那之后,你正试图做一些混乱的事情。我不知道你的化名怎么了C
. 要获得所需的格式,需要一个嵌套的foreach。这允许c为每一个都有一个记录
(userid, day)
以及所有相应的(pid,fulldate, x, y)
一个袋子里的元组。您可以在此处阅读有关嵌套foreach的更多信息:https://www.safaribooksonline.com/library/view/programming-pig/9781449317881/ch06.html (在该链接中搜索嵌套的foreach)。