0

当我执行叉积操作(随后是过滤)时,reducer 的大小非常不平衡,一些 reducer 写入零输出,而另一些则需要几个小时才能完成。一个基本示例是以下代码:

crossproduct = cross tweets, clients;

result = filter crossproduct by text matches CONCAT('.*', CONCAT(keyword, '.*'));

store result into 'result' using PigStorage(' ');

在这种情况下,减速器键是什么?

4

1 回答 1

2

这是一个很难回答的问题。Cross 在 Pig 中实现为合成键的连接。了解 cross 的最佳资源是Programming Pig - 第 68 页

在您的示例中,十字架实际上看起来像

A = foreach tweets generate flatten(GFCross(0,2)), flatten(*);
B = foreach clients generate flatten(GFCross(1,2)), flatten(*);
C = cogroup A by ($0, $1), B by ($0, $1);
crossproduct = foreach C generate flatten(A), flatten(B);

正如书中所解释的,GFCross 是一个内部 UDF。第一个参数是输入数,第二个参数是输入总数。在您的示例中,UDF 生成具有 (int, int) 架构的记录。与第一个参数相同的字段有一个介于 0 和 3 之间的随机数。另一个字段从 0 到 3 计数。因此,如果您假设 A 中的第一条记录具有随机数 3,并且第一条记录在B 具有随机数 2,UDF 为每个输入生成以下 4 个元组。

A {(3,0), (3,1), (3,2), (3,3)}
B {(0,2), (1,2), (2,2), (3,2)}

执行连接时,(3,2) 元组与 B 中的 (3,2) 元组连接。对于每个输入中的每条记录,保证只有一个且只有一个人工键实例将匹配并产生记录。

因此,要回答您关于究竟什么是reduce 键的问题……reduce 键是GFCross 生成的合成键。由于为每条记录选择不同的随机数,因此应在 reducer 的均匀分布上完成结果连接。

于 2013-08-01T19:30:11.197 回答