我有一个猪脚本,可以对不同的客户进行分组和计数,如下所示
by_customer = GROUP customer BY (start_date, spc);
cust_cnt = FOREACH by_customer {
cust = DISTINCT customer.cid;
GENERATE FLATTEN(group), COUNT(cust);
};
问题是最后一个化简器由于内存问题而挂起或失败。我可以看到分布在化简器中的数据高度偏斜。有没有办法分配组的输出,使得每个减速器只得到一个分组包。
您可以对组 by 使用并行语句来增加化简器的数量。如果你的数据真的非常非常偏斜,这将无济于事,因为一个化简器仍然可能会获得太多数据。缓解这种情况的常用方法是引入一个随机数字段并将其添加到分组依据中。
customer_random = foreach customer generate RANDOM() as seed, start_date, spc, cid, ...
by_customer = group customer_random by (seed, start_date, spc);
显然,这会产生与原始不同的组,因此在进一步处理时需要考虑这一点(不同的计数、总和等)。使事情变得有点复杂,但应该在化简器之间更好地分配数据。
我通过执行解决方法来解决此问题,以便在不使用不同关键字的情况下获取不同的计数。
by_customer = GROUP customer BY (cid,start_date,spc);
dist_customer = FOREACH by_customer GENERATE group.start_date as start_date,group.spc as spc,1 as cst_cnt;
cust = GROUP dist_customer by (start_date,spc);
cust_cnt = FOREACH cust GENERATE FLATTEN(group), SUM(dist_customer.cst_cnt);
这非常有效。不知道为什么不同不起作用。
感谢您的帮助。