如何在 pig latin 中分组后进行排序和限制而不会使工作崩溃

how to order and limit after group by in pig latin without crashing the job

很多时候,我们有兴趣获取一组(在排序后)的顶部或底部,这些集合在排序前已按某些键分组。

A = FOREACH data
     GENERATE x,y,z;

B = DISTINCT A;
C = GROUP B BY (x,y) PARALLEL 11;
D = FOREACH C {
              ORDERD = ORDER B BY z DESC;
              FIRST_REC = LIMIT ORDERD 1;
              GENERATE FLATTEN(FIRST_REC) AS (x,y,z);
        };

STORE D INTO 'xyz' USING PigStorage();  

上面的 foreach 生成需要 'forever' 完成并最终在 12 小时左右后被杀死。 负责这个的 mapreduce 作业说产生了 3maps,4reducers,然后 1reducer 保持处理了一整天,最终由于错误 6017,文件错误而终止。

有没有办法解决这个问题,或者有更好的方法来做我想做的事?

涉及的数据量是多少?您确定您的数据节点足够大以处理该数据量吗?

如果是这样,我会选择 MAX 而不是 ORDER。这样一来,内存中只需要保留一个元组就足够了,因为组已经包含了所有其他需要的信息:

D = FOREACH C GENERATE group, MAX (B.z);