使用PigLatin-hadoop在内部包中插入元组

cbeh67ev  于 2021-05-31  发布在  Hadoop
关注(0)|答案(2)|浏览(378)

我正在尝试使用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的结果没有给出我想要的格式!我做错了什么?

zvokhttg

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 值等。请尝试以使元组嵌套在包中的方式选择这些字段:

C = FOREACH B GENERATE 
    FLATTEN(group) AS (userid, day), 
    A.(pid, fulldate, x, y) AS A;
ckx4rj1h

ckx4rj1h2#

你是对的,直到 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)。

相关问题