0

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

用户 ID,日期,{(pid,fulldate, x,y),(pid,fulldate, x,y), ...}

关系描述:每个用户(userid)在每一天(day)都购买了多个产品(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:{组:(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 的结果没有给出我想要的格式!我做错了什么?

4

2 回答 2

1

我的理解是,这B几乎就是您要查找的内容,除了您希望包含useridand的元组day被展平,并且您只希望pid, fulldate, x, 和y出现在包中。

首先,您想要展平group具有字段userid和的元组,而day不是A包含多个元组的包。扁平化会取消group嵌套元组,它的每一行只有一组唯一值,而扁平化包A会有效地取消对您之前GROUP BY的语句的分组,因为包A中的值不是唯一的。所以第一部分应该读C = FOREACH B GENERATE FLATTEN(group) AS (userid, day);

接下来,您希望为每条记录保留pidfulldatexy单独的元组,但是您选择它们​​的方式基本上是所有pid值的包,所有值的包fulldate等。相反,请尝试在一种将元组嵌套在包中的方法:

C = FOREACH B GENERATE 
    FLATTEN(group) AS (userid, day), 
    A.(pid, fulldate, x, y) AS A;
于 2018-04-23T17:30:16.730 回答
1

你是正确的,直到GROUP BY部分。然而,在那之后你正试图做一些混乱的事情。我实际上不确定您的 alias 发生了什么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)。

于 2018-04-23T17:34:16.383 回答