从猪身上获得最大值

use*_*440 1 hadoop apache-pig

从猪获得最大价值:

学生(rollno,引号)

rollno. marks

1   24

2   26

3   50

4   30

5   35
Run Code Online (Sandbox Code Playgroud)

输出要求:最大标记滚动否.

输出:3 50

假设A包含student表的值

如何获得rollno.得分最高分

我试过这个:

B = GROUP A BY rollno

C = foreach B generate group , max( A.marks);
Run Code Online (Sandbox Code Playgroud)

但它结果所有记录可以任何人帮助我在猪

reo*_*toa 9

最可读的方式是ORDER您的数据,然后选择最佳记录LIMIT 1:

A = LOAD 'input' AS (rollno, marks);
B = ORDER A BY marks DESC;
C = LIMIT B 1;
DUMP C;

(3,50)
Run Code Online (Sandbox Code Playgroud)

但就Pig完成它所产生的MapReduce作业数量而言,这并不是非常有效.您有一个仅映射作业来加载数据,另一个用于对其进行采样(需要ORDER BY),另一个用于实际进行排序,最后一个用于执行LIMIT和输出.完成这项简单任务的4个工作.我花了1:54来运行它,几乎所有的时间都在MapReduce开销中.

但是如果您的输入不是太大,您可以只使用嵌套的foreach,然后所有这些工作将在一个reducer中进行,虽然不是可扩展的,但比每一步使用MapReduce要快得多.首先将所有内容分组到一个记录中,然后使用嵌套的foreach:

A = LOAD 'tmp/data.txt' AS (rollno, marks);
B = GROUP A ALL;
C = FOREACH B {
        ord = ORDER A BY marks DESC;
        top = LIMIT ord 1;
        GENERATE FLATTEN(top);  
};
DUMP C;

(3, 50)
Run Code Online (Sandbox Code Playgroud)

这只使用了一个MapReduce作业,并使用了0:35.

当然,如果您的数据足够小以至于MapReduce开销很重要,那么Pig可能不是您正在做的事情的正确工具.但是如果你为少量数据生成大量工作,并且你确实需要使用Pig,那么值得尝试使用嵌套的foreach.