【问题标题】:pig single group by value per reducer猪单组按每个减速器的值
【发布时间】:2015-01-14 07:13:22
【问题描述】:

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

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

问题是由于内存问题,最后一个 reducer 挂起或失败。 我可以看到分布在 reducer 之间的数据是高度倾斜的。 有没有办法分配 group by 的输出,使得每个 reducer 只得到一个分组包。

【问题讨论】:

  • 你试过使用 PARALLEL 吗?

标签: apache-pig grouping distinct skew


【解决方案1】:

您可以使用 group by 的并行语句来增加 reducer 的数量。如果您的数据真的非常偏斜,这将无济于事,因为一个 reducer 仍然可能获得太多数据。缓解这种情况的常用方法是引入一个随机数字段并将其添加到 group by。

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

显然,这会生成与最初不同的组,因此您需要在进一步处理时考虑到这一点(不同的计数、总和等)。使事情变得更复杂一些,但应该在 reducer 之间更好地分配数据。

【讨论】:

    【解决方案2】:

    我通过解决此问题来解决此问题,以在不使用 distinct 关键字的情况下获得不同的计数。

    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 不起作用。

    感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多