从猪获得最大值:
学生(rollno,马克)
rollno. marks
1 24
2 26
3 50
4 30
5 35
输出请求:最大标记滚动编号
输出: 3 50
假设A包含学生表的值
如何获得rollno。得分最高分
我试过了:
B = GROUP A BY rollno
C = foreach B generate group , max( A.marks);
但结果是所有记录都可以帮助我在猪中
答案 0 :(得分:9)
最可读的方法是ORDER
您的数据,然后选择LIMIT 1
的最佳记录:
A = LOAD 'input' AS (rollno, marks);
B = ORDER A BY marks DESC;
C = LIMIT B 1;
DUMP C;
(3,50)
但就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)
这只使用了一个MapReduce作业,并使用了0:35。
当然,如果您的数据足够小以至于MapReduce开销很重要,那么Pig可能不是您正在做的事情的正确工具。但是如果你为少量数据生成大量工作,并且你确实需要使用Pig,那么值得尝试使用嵌套的foreach。
答案 1 :(得分:3)
根据我的理解,您需要具有最大标记的单行和滚动编号
然后你必须按降序排序rollno并使用限制关键字(如下面的
)取顶行c=order b by marks desc;
d=limit c 1;
答案 2 :(得分:1)
a = Load 'data.txt' using PigStorage (',');
b = group a all;
c = foreach b GENERATE MAX(a.$1);
答案 3 :(得分:0)
这对我有用 -
userRollNoWithMarks = Load 'data.txt' using PigStorage (',');
maxNo = FOREACH(GROUP userRollNoWithMarks ALL) GENERATE MAX(userRollNoWithMarks .$1);
DUMP maxNo ;
答案 4 :(得分:-1)
B = GROUP A BY rollno;
C = foreach B generate group , MAX($1.$2);