1

从猪身上获得最大值:

学生(卷号,分数)

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);

但这导致所有记录都可以在猪中帮助我

4

5 回答 5

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)

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.

于 2013-02-26T15:10:36.967 回答
3

根据我的理解,您需要具有最大标记和卷号的单行。

然后,您必须按降序对 rollno 进行排序,并使用如下所示的限制关键字取顶行

c=order b by marks desc;

d=limit c 1;
于 2013-02-26T09:20:42.830 回答
1
  a = Load 'data.txt' using PigStorage (',');
  b = group a all;
  c = foreach b GENERATE  MAX(a.$1);
于 2015-06-13T06:31:54.750 回答
0

这对我有用-

userRollNoWithMarks = Load 'data.txt' using PigStorage (',');
maxNo = FOREACH(GROUP userRollNoWithMarks ALL) GENERATE  MAX(userRollNoWithMarks .$1);
DUMP maxNo ;
于 2016-04-01T16:07:31.700 回答
-1
B = GROUP A BY rollno;
C = foreach B generate group , MAX($1.$2);
于 2016-01-30T13:40:34.783 回答