【问题标题】:Inserting tuples inside an inner bag using Pig Latin - Hadoop使用 Pig Latin 将元组插入内袋 - Hadoop
【发布时间】:2018-04-23 15:29:45
【问题描述】:

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

【问题讨论】:

  • 上面的DESCRIBE B 输出是不可能的。我想你有B,它应该写成A,比如:B: {group: (userid: chararray,day: int),A: {(pid: chararray,day: int,fulldate: chararray,x: chararray,userid: chararray,y: chararray)}}我的回答假设这个包被命名为A
  • 你是对的,刚刚编辑了问题!

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


【解决方案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)。

【讨论】:

    【解决方案2】:

    我的理解是 B 几乎是您要查找的内容,除了您希望将包含 useridday 的元组展平,而您只希望 pidfulldatexy 出现在包中。

    首先,您想要展平具有字段useridday 的元组group,而不是包含多个元组的包A。展平group 会取消嵌套元组,该元组每行只有一组唯一值,而展平包A 将有效地取消组合您之前的@​​987654334@ 语句,因为包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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多