3

我有一个存储在 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 进行数学运算,但我的 for each 无法识别 T。

result = FOREACH X GENERATE $3*T;

它失败。它无法识别 T,因为 X 中没有称为 T 的字段。

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

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

4

1 回答 1

1

不幸的是,您选择的方式是做到这一点的最佳方式。Pig 没有独立变量的概念。您认为的单个变量 ,T实际上是一种关系,它只有一个包含一个字段的元组。Pig 一次操作一条记录,如果一条数据在该记录或内部参数(由%DEFAULT命令行参数定义的东西)中不可用,则您无法使用它。

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

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

通过虚拟值连接1使得JOIN等价于 a CROSSUSING 'replicated'放入T内存中,因此可以在映射阶段完成,从而与相邻的 MR 作业相结合。

于 2013-10-27T03:40:46.283 回答