如何在 Pig 和 Hive 中找到第 n 个最大和最小的数字?

Posted

技术标签:

【中文标题】如何在 Pig 和 Hive 中找到第 n 个最大和最小的数字?【英文标题】:How find nth largest and smallest number in Pig and Hive? 【发布时间】:2017-07-01 13:30:01 【问题描述】:

我有一个包含列 id、名称和薪水的表格 我想从表中找到第 N 个最大和最小的薪水

Id Name Salary
--------------
1  aa   11111
--------------
2  bb   77777
-------------
3 cc 33333
-------------
4 dd 44444
-------------
5 ee 99999

【问题讨论】:

Pig 和 Hive 都支持排名功能。 @pritZ:如果它有帮助并赞成,请接受答案。这也将有助于其他寻找类似查询的人。 【参考方案1】:

在蜂巢中:

第n个MAX工资

查询:

select id,name,salary from (
select id,name,salary,rank() over(ORDER BY salary DESC)ran from salarytable ) s 
where ran=1;

输出:

5 ee 99999

第n个最低工资

查询:

select id,name,salary from (
select id,name,salary,rank() over(ORDER BY salary ASC)ran from salarytable ) s 
where ran=4;

输出:

4 dd 4444

P.S:rank() 的号码将在这里定义第 n 个值。

【讨论】:

感谢您的帮助【参考方案2】:

您可以使用 LIMIT 或 Rank。使用 LIMIT,加载数据,按降序排序以获得最大的薪水。将数据限制为第 N 条记录。这将为您提供 N 条记录,其中第 N 条记录将在数据集的底部。再次按升序排序,这将为您提供第 N 条记录作为最高记录,然后再次使用 LIMIT 获得最高记录。对最小的使用类似的步骤。在按升序排序的地方,限制为第 N 条记录并按降序再次排序排序和限制 1.

A = LOAD 'data.txt' USING PigStorage(',') AS (id:int,name:chararray,salary:int);
B = ORDER A BY Salary DESC;
C = LIMIT B 4; --Note: N = 4
D = ORDER C BY salary ASC;
E = LIMIT D 1;

【讨论】:

谢谢它解决了我的问题,但是当图片进入大数据时,它可以在最短的时间内提高性能

以上是关于如何在 Pig 和 Hive 中找到第 n 个最大和最小的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PIG 在给定数据集中找到最大年份?

如何在指数级大列表中找到第 k 个最大的元素?

如何在 PIG 中进行 DIFF

Unix Shell 脚本作为 Pig 和 Hive 的 UDF

Hadoop-3.0.0 与旧版本 Hive、Pig、Sqoop 和 Spark 的兼容性如何

使用 Hive 或 Pig 在字段中查找重复次数最多的值