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

uklbhaso  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(282)

我有一个元组存储在:

{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不熟悉。我的解决方案,似乎不是很优雅。

vsnjm48y

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作业相结合。

相关问题