请考虑以下代码:
ebook = LOAD '$ebook' USING PigStorage AS (line:chararray);
ranked = RANK ebook;
关系ranked
有两个字段:行号和文本。该文本名为line
,可以通过此别名引用,但RANK
生成的行号没有。因此,我可以引用它的唯一方法是$0
。
如何为$0
提供一个名称,以便我可以在加入其他数据集后更轻松地引用该名称,而不再是$0
?
答案 0 :(得分:1)
您要做的是为您的数据定义架构。最简单的方法是使用AS
keywoard,就像您使用LOAD
一样。
您可以使用三个运算符定义架构:LOAD
,STREAM
和FOREACH
。
在这里,最简单的方法是:
ebook = LOAD '$ebook' USING PigStorage AS (line:chararray);
ranked = RANK ebook;
renamed_ranked = foreach B generate $0 as rank, $1;
您可以在associated documentation找到更多信息。
知道此操作不会为您的脚本添加迭代也很好。正如@ ArnonRotem-Gal-Oz所说:
Pig没有以连续方式执行操作,即它没有进行所有排名,然后对所有记录进行另一次迭代。猪优化器在分配等级时将进行重命名。您可以在pig cookbook中找到类似的行为。
答案 1 :(得分:1)
您可以使用FOREACH添加投影
named_ranked = FOREACH ranked GENERATE $0 as r,*;