从pig获取行中的最大值

m0rkklqb  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(300)

要从清管器获得最大值:
学生(卷号,分数)

rollno. marks

1   24

2   26

3   50

4   30

5   35

输出要求:最大标记卷号。
输出:350
假设a包含student表的值
如何得到罗尔诺。得分最高
我试过这个:

B = GROUP A BY rollno

C = foreach B generate group , max( A.marks);

但这是所有的记录,任何一个可以帮助我在这头Pig

kuuvgm7e

kuuvgm7e1#

据我所知,你方要求单列最高分和卷号。
然后您必须按降序对rollno进行排序,并使用下面的limit关键字获取最上面的一行

c=order b by marks desc;

d=limit c 1;
olhwl3o2

olhwl3o22#

B = GROUP A BY rollno;
C = foreach B generate group , MAX($1.$2);
kwvwclae

kwvwclae3#

最具可读性的方法是 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工作数量而言,这并不是很有效。您有一个map-only作业来加载数据,另一个用于对其进行采样(由 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是值得的。

6pp0gazn

6pp0gazn4#

a = Load 'data.txt' using PigStorage (',');
  b = group a all;
  c = foreach b GENERATE  MAX(a.$1);
px9o7tmv

px9o7tmv5#

这对我有用-

userRollNoWithMarks = Load 'data.txt' using PigStorage (',');
maxNo = FOREACH(GROUP userRollNoWithMarks ALL) GENERATE  MAX(userRollNoWithMarks .$1);
DUMP maxNo ;

相关问题