如何在猪中存储和使用变量

时间:2013-10-27 00:20:18

标签: apache-pig

我有一个存储在A:

中的元组
{group: chararray,word_count: long}

所以,我将所有word_count变量加起来,并将其存储在变量T:

T: {long}

现在,我有一个看起来像的变量X:

(word1,12,word1,1)
(word2,22,word2,4)
(word3,32,word3,14)

我需要针对存储在T中的值对1,4和14进行数学运算, 但我的每一个都不承认T.

result = FOREACH X GENERATE $3*T;

失败了。它不识别T,因为在X中没有名为T的字段。

所以,我做的是,我越过X和T     temp = CROSS X,T

这是正确的方法吗?我是猪的新手。我的解决方案,似乎并不是很优雅。

1 个答案:

答案 0 :(得分:1)

不幸的是,您选择的方式是最好的方法。 Pig没有独立变量的概念。您认为单个变量T实际上是一个只有一个元组与一个字段的关系。 Pig一次操作一条记录,如果该记录中没有数据,或者内部参数(由%DEFAULT或命令行参数定义的内容),则不能使用它

我将对您的方法做出的一项修正是,使用CROSS将读取两个关系,执行交叉产品,然后将其写回磁盘。这是浪费资源。相反,您可以使用JOIN并利用特殊指令USING 'replicated'。这指示Pig将第二个关系存储在内存中并在映射阶段进行连接,而不是将数据发送到reducer,进行连接并将其写入磁盘。

temp = JOIN X BY 1, T BY 1 USING 'replicated';

通过虚拟值1加入会使JOIN等效于CROSSUSING 'replicated'T放入内存中,以便在映射阶段完成,从而与相邻的MR作业相结合。