【问题标题】:sub query in apache pigapache pig中的子查询
【发布时间】:2012-01-10 12:11:48
【问题描述】:

寻找一些关于在 apache pig 中编写子查询的帮助。例如我有以下两个关系-

A
sam 12 grad maths
sony 13 postgrad english

B
maths {(4.5,sam),(4,david)}
english {(4.2,peter),(3.9,rob)}

按主题连接两个关系,即 A 通过 A.$3 和 B 通过 B.$0,并且必须编写查询,它将输出为 -

sam 12 grad maths 4.5
sony 13 postgrad english 

基本上它应该检查 B 中的匹配主题,然后在其中查找名称。

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案1】:

    我的处理方法是flattenB 关系,然后在 A 上进行左外连接。

    首先,将关系拉平:

    C = FOREACH B GENERATE $0, FLATTEN($1);
    

    这会将您的日期转换为:

    maths, 4.5, sam
    maths, 4, david
    english, 4.2, peter
    english, 3.9, rob
    

    现在,您只需执行 JOIN 即可将数据汇总在一起(我正在重命名这些内容以保持头脑清醒):

    J = JOIN A BY (Aname, Asubject), C BY (Bname, Bsubject);
    J2 = FOREACH J GENERATE Astudent, Agrade, Alevel, Asubject, Bscore;
    

    dump J2 将只输出sam, 12, grad, maths, 4.5

    但是,有一个问题。如果列表 A 中的项目未显示在列表 B 中,您似乎希望获得 NULL 值。这是 LEFT OUTER join 的工作,幸运的是 Pig can do outer joins。将上述代码修改如下:

    J = JOIN A BY (Aname, Asubject) LEFT OUTER, C BY (Bname, Bsubject);
    J2 = FOREACH J GENERATE Astudent, Agrade, Alevel, Asubject, Bscore;
    

    dump J2 这里会输出,这就是我想你想要的:

    sam, 12, grad, maths, 4.5
    sony, 13, postgrad, english, 
    

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多