简单的pig连接和处理两个包

eit6fx6z  于 2021-06-04  发布在  Hadoop
关注(0)|答案(1)|浏览(428)

我有以下简单的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:需要从关系投影列才能将其用作标量
你能帮忙吗?
最好的,莎拉

mfuanj7w

mfuanj7w1#

根据isempty文件:
,,检查行李或Map是否为空”
在您的例子中,它不起作用,因为c只是一个外部包,包含一个元组/行,其中包含来自aa和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用于连接两个关系,这将创建一个内部包,isempty可以对其进行操作。后来这被left join所取代,它导致了与您描述的相同的问题。

相关问题