我有一个元组存储在:
{group: chararray,word_count: long}
所以,我求所有word\u count变量的和,并将其存储在变量t中:
T: {long}
现在,我有一个变量x,它看起来像:
(word1,12,word1,1)
(word2,22,word2,4)
(word3,32,word3,14)
我需要对存储在t中的值对1、4和14进行数学运算,但是for each不能识别t。
result = FOREACH X GENERATE $3*T;
它失败了。它不能识别t,因为在x中没有称为t的字段。
所以,我做的是,我穿过x,t温度=穿过x,t
这是正确的方法吗??我对Pig不熟悉。我的解决方案,似乎不是很优雅。
1条答案
按热度按时间vsnjm48y1#
不幸的是,你选择的方法是最好的方法。pig没有独立变量的概念。你认为是一个单一的变量,
T
,实际上是一个只有一个元组和一个字段的关系。pig一次操作一条记录,如果该记录或内部参数(由%DEFAULT
或者命令行参数),则不能使用它。我要对你的方法做的一个修正是
CROSS
将读入这两个关系,执行叉积,然后将其写回磁盘。这是浪费资源。相反,你可以使用JOIN
利用特别指令USING 'replicated'
. 这指示pig将第二个关系存储在内存中,并在map阶段执行连接,而不是将数据发送到reducer、执行连接并将其写入磁盘。temp = JOIN X BY 1, T BY 1 USING 'replicated';
通过虚拟值连接1
使JOIN
相当于CROSS
.USING 'replicated'
放T
这样就可以在map阶段完成,从而与相邻的mr作业相结合。