如何在 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);
很多时候,我们有兴趣获取一组(在排序后)的顶部或底部,这些集合在排序前已按某些键分组。
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);