简单的猪加入和处理两个袋子

时间:2013-02-16 08:05:28

标签: hadoop apache-pig

我有以下简单的猪脚本,

AA = LOAD 'A' USING PigStorage(',') as (f1,f2,f3);
BB = LOAD 'B' AS (f1);
C = foreach AA generate f1;
C = JOIN AA BY f1 LEFT OUTER, BB BY f1 using 'replicated';
D = FOREACH C GENERATE FLATTEN((IsEmpty(AA) ? null : AA));
store D into 'd';

但是当我跑步时,它给了我这个错误:

标量投影无效:AA:需要从一个关系中投射一个列,以便将其用作标量

你能帮忙吗?

最佳, 萨拉

1 个答案:

答案 0 :(得分:2)

根据IsEmpty文档:

  

,,检查行李或地图是否为空“

在你的情况下它不起作用,因为 C 只是一个外包,其中包含一个元组/行,其中的字段来自 AA 和< em> BB :

C: {AA::f1: int,AA::f2: chararray,AA::f3: chararray,BB::f1: int}

您可以在 AA 的每个字段上应用Bincond运算符,而不是检查和替换值,例如:

D = foreach C generate (AA::f1 is null ? '-1' : AA::id) ... ;

但是如果你坚持使用IsEmpty,那么下面的工作就可以了:

D = foreach C {
 bg = TOBAG(TOTUPLE(AA::f1,AA::f2,AA::f3));
 generate IsEmpty(bg) ...;
}

注意:
我想在IsEmpty部分的Pig文档中可能会有拼写错误。 示例 cogroup 中的Earlier用于加入两个关系,这两个关系创建了一个IsEmpty可以运行的内袋。 Later这被左连接取代,导致您描述的问题相同。