很多时候,我们有兴趣获取一组(在排序依据之后)的顶部或底部,该组在排序之前已按某些键分组。
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 生成需要“永远”才能完成,并最终在 12 小时左右后被杀死。 负责此操作的 mapreduce 作业生成了 3 个map、4 个 reducer ,然后 1 个 reducer 仍在处理一整天,并最终因错误 6017(文件错误)而终止。
有没有办法解决这个问题或者有更好的方法来做我想做的事情?
最佳答案
涉及的数据量是多少?您确定您的数据节点足够大以处理那么多数据吗?
如果是这样,我会选择 MAX,而不是订单。这样,只需将一个元组保留在内存中就足够了,因为组已经包含所有其他所需的信息:
D = FOREACH C GENERATE group, MAX (B.z);
关于hadoop - 如何在 pig 拉丁语中进行分组后排序和限制而不破坏工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31591171/