从猪获得最大价值:
学生(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)
但它结果所有记录可以任何人帮助我在猪
最可读的方式是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.
归档时间: |
|
查看次数: |
10556 次 |
最近记录: |