我有一个存储在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
这是正确的方法吗?我是猪的新手。我的解决方案,似乎并不是很优雅。
答案 0 :(得分:1)
不幸的是,您选择的方式是最好的方法。 Pig没有独立变量的概念。您认为单个变量T
实际上是一个只有一个元组与一个字段的关系。 Pig一次操作一条记录,如果该记录中没有数据,或者内部参数(由%DEFAULT
或命令行参数定义的内容),则不能使用它
我将对您的方法做出的一项修正是,使用CROSS
将读取两个关系,执行交叉产品,然后将其写回磁盘。这是浪费资源。相反,您可以使用JOIN
并利用特殊指令USING 'replicated'
。这指示Pig将第二个关系存储在内存中并在映射阶段进行连接,而不是将数据发送到reducer,进行连接并将其写入磁盘。
temp = JOIN X BY 1, T BY 1 USING 'replicated';
通过虚拟值1
加入会使JOIN
等效于CROSS
。 USING 'replicated'
将T
放入内存中,以便在映射阶段完成,从而与相邻的MR作业相结合。