如何在 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 个最大和最小的数字?的主要内容,如果未能解决你的问题,请参考以下文章
Unix Shell 脚本作为 Pig 和 Hive 的 UDF