2

我有以下简单的猪脚本,

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:需要从关系中投影列才能用作标量

能否请你帮忙?

最好的,萨拉

4

1 回答 1

2

根据IsEmpty文档:

,,检查包或地图是否为空"

在您的情况下,它不起作用,因为C只是一个包含一个元组/行的外袋,其中包含来自AABB的字段:

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用于连接两个关系,这创建了一个 IsEmpty 可以在其上操作的内袋。后来这被左连接取代,这会导致您描述的相同问题。

于 2013-02-16T18:18:26.430 回答