Hive 2.X如何获取列中最大的n个值?原greatest_n函数失效
在Hive 2.X中替代
greatest_n实现取列中最大10个值的方案 哦,这个坑我踩过!Hive 2.X开始移除了旧版本(比如0.13)里非标准的greatest_n函数,所以直接调用会报语义错误。根据你的需求,我给你几种常用的替代方案,看哪种更贴合你的场景:
方案1:提取所有列值后取全局Top10
如果你的需求是把mycol1和mycol2所有行的数值合并起来,取最大的10个值,可以用stack函数将列转成行,再排序筛选:
USE mydb; WITH unpivoted_data AS ( -- 把mycol1、mycol2转成单行单值的格式 SELECT stack(2, mycol1, mycol2) AS column_value FROM mytab ) SELECT column_value FROM unpivoted_data ORDER BY column_value DESC LIMIT 10;
- 原理:
stack(2, col1, col2)会把每一行的两个列值拆成两行数据,这样所有列的数值就都在同一列里了,后续排序取前10即可。 - 如果需要处理更多列,只需要把
stack的第一个参数改成列的数量,后面依次列上所有目标列就行(比如3列就写stack(3, col1, col2, col3))。
方案2:保留原表关联信息的全局Top10
如果需要知道这些最大值来自原表的哪一行、哪一列,可以用LATERAL VIEW配合stack来保留额外信息:
USE mydb; WITH unpivoted_data AS ( SELECT row_id, -- 假设原表有唯一标识行的字段,没有的话可以用monotonically_increasing_id()生成 column_name, column_value FROM mytab -- 同时拆分列名和列值,方便溯源 LATERAL VIEW stack(2, 'mycol1', mycol1, 'mycol2', mycol2) AS column_name, column_value ) SELECT row_id, column_name, column_value FROM unpivoted_data ORDER BY column_value DESC LIMIT 10;
方案3:每行内取多列的前N个最大值
如果你的原需求是对每一行,从mycol1和mycol2中取最大的若干值(两列最多只有2个值,这里举通用例子),可以用sort_array函数:
USE mydb; SELECT -- sort_array第二个参数为FALSE表示降序排列,取数组前N个元素就是前N大的值 sort_array(array(mycol1, mycol2), FALSE)[0] AS top1_value, sort_array(array(mycol1, mycol2), FALSE)[1] AS top2_value -- 列数更多的话可以继续往后取,比如[2]是第三大的值 FROM mytab;
根据你的实际需求选对应的方案就行,亲测在Hive 2.X及以上版本都能正常运行~
内容的提问来源于stack exchange,提问作者AbtPst
相关产品推荐
相关产品推荐

