简单的猪加入和处理两个袋子
Posted
技术标签:
【中文标题】简单的猪加入和处理两个袋子【英文标题】:simple pig to join and process two bags 【发布时间】:2013-02-16 08:05:27 【问题描述】:我有以下简单的猪脚本,
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】:根据IsEmpty 文档:
,,检查包或地图是否为空"
在你的情况下它不起作用,因为 C 只是一个 outer bag 包含一个元组/行,其中包含 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 文档中可能存在拼写错误。 Earlier 在示例中 cogroup 用于连接两个关系,创建一个 IsEmpty 可以在其上操作的内袋。 Later 这已被左连接替换,这会导致您描述的相同问题。
【讨论】:
以上是关于简单的猪加入和处理两个袋子的主要内容,如果未能解决你的问题,请参考以下文章