我有以下简单的猪脚本,
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:需要从一个关系中投射一个列,以便将其用作标量
你能帮忙吗?
最佳, 萨拉
答案 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这被左连接取代,导致您描述的问题相同。