按每个减速机的值划分的pig单组

qnakjoqk  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(279)

我有一个pig脚本,它对不同的客户进行分组和计数,如下所示

by_customer = GROUP customer BY (start_date, spc);
     cust_cnt = FOREACH by_customer {
     cust =     DISTINCT customer.cid;
     GENERATE  FLATTEN(group), COUNT(cust);
    };

问题是最后一个reducer由于内存问题而挂起或失败。我可以看到分布在减速器中的数据是高度倾斜的。是否有一种方法来分配分组输出,使得每个减速机只得到一个分组包。

jaql4c8m

jaql4c8m1#

我解决了这个问题,做了一个变通办法,不使用distinct关键字获得distinct count。 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); 这很有效。不知道为什么distinct不起作用。
谢谢你的帮助。

dsekswqp

dsekswqp2#

您可以使用GROUPBY的并行语句来增加减速器的数量。如果你的数据是真的,真的倾斜,这将不会有帮助,虽然因为一个减速机仍然可能得到太多的数据。缓解这种情况的常用方法是引入一个随机数字段,并将其添加到分组中。

customer_random = foreach customer generate RANDOM() as seed, start_date, spc, cid, ...
by_customer = group customer_random by (seed, start_date, spc);

显然,这会生成不同于原来的组,因此在进一步处理(不同的计数、总和等)时需要考虑到这一点。使事情变得更加复杂,但是应该在减速器之间更好地分配数据。

相关问题