2

我的代码是这样的:

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp = GROUP pymt BY key

results = FOREACH pymt_grp {

      /*
       *   some kind of logic, filter, count, distinct, sum, etc.
       */
}

但现在我发现很多这样的日志:

org.apache.pig.impl.util.SpillableMemoryManager: Spilled an estimate of 207012796 bytes from 1 objects. init = 5439488(5312K) used = 424200488(414258K) committed = 559284224(546176K) max = 559284224(546176K)

实际上我找到了原因,主要是因为有一个“热”键,比如 key=0 作为 ip 地址,但我不想过滤这个键。有什么解决办法吗?我在我的 UDF 中实现了代数和累加器接口。

4

1 回答 1

6

对于严重偏斜的数据或嵌套在 FOREACH 中的 DISTINCT,我遇到了类似的问题(因为 PIG 会在内存中区分)。解决方案是以 FOREACH 中的 DISTINCT 为例,请参阅我对如何在 PIG latin 中优化分组语句的回答?

如果您不想在 SUM 和 COUNT 之前执行 DISTINCT,我建议您使用 2 GROUP BY。Key 列上的第一个组加上另一列或随机数 mod 100,它充当 Salt(将单个 key 的数据传播到多个 Reducer)。比仅在 Key 列上的第二个 GROUP BY 并计算组 1 COUNT 或 Sum 的最终 SUM。

前任:

inpt = load '/data.csv' using PigStorage(',') as (Key, Value);
view = foreach inpt generate Key, Value, ((int)(RANDOM() * 100)) as Salt;

group_1 = group view by (Key, Salt);
group_1_count = foreach group_1 generate group_1.Key as Key, COUNT(view) as count;

group_2 = group group_1_count by Key;
final_count = foreach group_2 generate flatten(group) as Key, SUM(group_1_count.count) as count;
于 2012-08-17T10:03:43.700 回答