当我执行交叉产品操作(然后进行过滤)时,减速器尺寸非常不平衡,一些减速器写入零输出,而其他减速器需要几个小时才能完成。一个基本的例子是以下代码:
crossproduct = cross tweets, clients;
result = filter crossproduct by text matches CONCAT('.*', CONCAT(keyword, '.*'));
store result into 'result' using PigStorage(' ');
在这种情况下,什么是reducer密钥?
答案 0 :(得分:2)
这是一个难以回答的问题。 Cross在Pig中实现为合成键的连接。理解交叉的最佳资源是Programming Pig - Page 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生成的合成键。由于每个记录的随机数选择不同,因此所得到的连接应该在均衡器的均匀分布上完成。