从猪身上获得最大值

时间:2013-02-26 08:52:50

标签: hadoop apache-pig

从猪获得最大值:

学生(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);

但结果是所有记录都可以帮助我在猪中

5 个答案:

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