【问题标题】:pig - how to reference columns in a FOREACH after a JOIN?pig - 如何在 JOIN 后引用 FOREACH 中的列?
【发布时间】:2011-12-24 11:17:06
【问题描述】:
A = load 'a.txt' as (id, a1);
B = load 'b.txt as (id, b1);
C = join A by id, B by id;
D = foreach C generate id,a1,b1;
dump D;

第 4 行失败: Invalid field projection. Projected field [id] does not exist in schema

我尝试更改为 A.id 但最后一行失败:ERROR 0: Scalar has more than one row in the output.

【问题讨论】:

    标签: apache-pig


    【解决方案1】:

    您正在寻找的是"Disambiguate Operator"。你想要的是A::id,而不是A.id

    A.id 说“有一个 relation/bag A 并且在其架构中有一个名为 id 的列”

    A::id 说“有一个来自A记录,并且有一个名为id 的列”

    所以,你会这样做:

    A = load 'a.txt' as (id, a1);
    B = load 'b.txt as (id, b1);
    C = join A by id, B by id;
    D = foreach C generate A::id,a1,b1;
    dump D;
    

    一个肮脏的选择:

    只是因为我很懒,当你开始一个接一个地进行多个连接时,消歧变得非常奇怪:使用唯一标识符。

    A = load 'a.txt' as (ida, a1);
    B = load 'b.txt as (idb, b1);
    C = join A by ida, B by idb;
    D = foreach C generate ida,a1,b1;
    dump D;
    

    【讨论】:

    • 感谢您的解释。添加指向此related question 的链接。
    • 如果我对字段名称有任何疑问,我只需使用 DESCRIBE。在你的情况下 DESCRIBE C;给我们 C: {A::id: bytearray,A::a1: bytearray,B::id: bytearray,B::b1: bytearray}。现在您可以轻松找到正确的字段名称。
    • 有什么方法可以通过某种自省来动态访问从连接结果中的“A”获取的字段的名称?例如,如果我直到运行时才知道“A”的架构,然后我希望第 4 行的结果投影只包含来自“A”而不是“B”的列,该怎么办?谢谢。
    【解决方案2】:

    @nweiler :如果你知道关系 A 的第一个和最后一个字段,那么你可以写如下内容:

         D = FOREACH C GENERATE A::FirstCol..A:LastCol ;
    

    这将为您提供 FirstCol 和 LastCol 之间的所有列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多