2013-07-31 40 views
0

当我执行交叉产品操作(接着进行过滤)时,减速机尺寸非常不平衡,一些减速机写零输出,其他几个小时完成。一个基本的例子是下面的代码:猪叉产品减速机钥匙

crossproduct = cross tweets, clients; 

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

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

在这种情况下,减速钥匙是什么?

回答

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)元组加入到(3,2)的元组中B.对于每个输入的每个记录,可以保证有一个且只有一个将匹配并产生记录的人造钥匙的实例。

因此,要回答您的确切答案是什么的问题... reduce键是由GFCross生成的综合键。由于随机数对于每条记录的选择都不相同,因此所产生的连接应该以减速器的均匀分布完成。