如何重命名关系中的字段

时间:2014-06-13 13:56:39

标签: hadoop apache-pig

请考虑以下代码:

ebook = LOAD '$ebook' USING PigStorage AS (line:chararray);
ranked = RANK ebook;

关系ranked有两个字段:行号和文本。该文本名为line,可以通过此别名引用,但RANK生成的行号没有。因此,我可以引用它的唯一方法是$0

如何为$0提供一个名称,以便我可以在加入其他数据集后更轻松地引用该名称,而不再是$0

2 个答案:

答案 0 :(得分:1)

您要做的是为您的数据定义架构。最简单的方法是使用AS keywoard,就像您使用LOAD一样。

您可以使用三个运算符定义架构:LOADSTREAMFOREACH。 在这里,最简单的方法是:

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,*;