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)
5条答案
按热度按时间kuuvgm7e1#
据我所知,你方要求单列最高分和卷号。
然后您必须按降序对rollno进行排序,并使用下面的limit关键字获取最上面的一行
olhwl3o22#
kwvwclae3#
最具可读性的方法是
ORDER
然后用LIMIT 1
:但就pig为完成任务而产生的mapreduce工作数量而言,这并不是很有效。您有一个map-only作业来加载数据,另一个用于对其进行采样(由
ORDER BY
),另一个实际执行排序,最后一个执行LIMIT
和输出。4个简单的工作。我花了1:54运行这个,几乎所有的时间都在mapreduce开销中。但是如果您的输入不是太大,您可以只使用一个嵌套的foreach,然后所有的工作都将在一个reducer中进行,虽然没有那么可伸缩,但是在每个步骤中都比使用mapreduce快得多。首先将所有内容分组到一个记录中,然后使用嵌套的foreach:
这只使用了一个mapreduce作业,时间是0:35。
当然,如果您的数据足够小,mapreduce开销很重要,那么pig可能不是您所做工作的合适工具。但是,如果要为少量数据生成大量作业,并且确实需要使用pig,那么尝试使用嵌套foreach是值得的。
6pp0gazn4#
px9o7tmv5#
这对我有用-