从猪身上获得最大值:
学生(卷号,分数)
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);
但这导致所有记录都可以在猪中帮助我
从猪身上获得最大值:
学生(卷号,分数)
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);
但这导致所有记录都可以在猪中帮助我
最易读的方法是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)
This only used one MapReduce job, and took 0:35.
Of course, if your data is small enough that MapReduce overhead matters, Pig may not be the right tool for what you're doing. But if you're generating a lot of jobs for a small amount of data, and you do need to use Pig, it's worth trying to use the nested foreach.
根据我的理解,您需要具有最大标记和卷号的单行。
然后,您必须按降序对 rollno 进行排序,并使用如下所示的限制关键字取顶行
c=order b by marks desc;
d=limit c 1;
a = Load 'data.txt' using PigStorage (',');
b = group a all;
c = foreach b GENERATE MAX(a.$1);
这对我有用-
userRollNoWithMarks = Load 'data.txt' using PigStorage (',');
maxNo = FOREACH(GROUP userRollNoWithMarks ALL) GENERATE MAX(userRollNoWithMarks .$1);
DUMP maxNo ;
B = GROUP A BY rollno;
C = foreach B generate group , MAX($1.$2);