【问题标题】:Self cross-join in pig is disregarded猪中的自我交叉加入被忽略
【发布时间】:2013-02-21 18:59:35
【问题描述】:

如果有这样的数据:

A = LOAD 'data' AS (a1:int,a2:int,a3:int);

DUMP A;
(1,2,3)
(4,2,1)

然后在A,A上做一个cross-join:

B = CROSS A, A;

DUMP B;
(1,2,3)
(4,2,1)

为什么第二个 A 从查询中优化出来?

信息:猪 0.11 版

== 更新 ==

如果我对 A 进行排序:

C = ORDER A BY a1;
D = CROSS A, C;

它将给出正确的交叉连接。

【问题讨论】:

    标签: apache-pig cross-join


    【解决方案1】:

    davek 是正确的——你不能CROSS(或JOIN)与它自己建立关系。如果您希望这样做,您必须创建数据的副本。在这种情况下,您可以使用另一个 LOAD 语句。如果您想对管道下方的关系执行此操作,则需要使用 FOREACH 复制它。

    我有几个经常使用的宏,默认情况下在我的所有 Pig 脚本中使用 IMPORT,以备不时之需。一个仅用于此目的:

    DEFINE DUPLICATE(in) RETURNS out
    {
            $out = FOREACH $in GENERATE *;
    };
    

    这将适用于您在管道中需要复制的任何地方:

    A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
    A2 = DUPLICATE(A1);
    B = CROSS A1, A2;
    

    请注意,即使A1A2 相同,您也不能假定记录的顺序相同。但是,如果您正在执行 CROSSJOIN,这可能无关紧要。

    【讨论】:

      【解决方案2】:

      我认为你必须加载两次数据才能达到你想要的效果。

      A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
      A2 = LOAD 'data' AS (a1:int,a2:int,a3:int);
      B = CROSS A1, A2;
      

      【讨论】:

      • 这是因为在后台生成的 map-reduce 作业类型:无论您如何进行连接,都需要两个单独的输入。
      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2023-04-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多