Hive 问题 - Rank() OVER (PARTITION BY Dept ORDER BY sum(salary))
Posted
技术标签:
【中文标题】Hive 问题 - Rank() OVER (PARTITION BY Dept ORDER BY sum(salary))【英文标题】:Hive question - Rank() OVER (PARTITION BY dept ORDER BY sum(salary)) 【发布时间】:2019-03-18 02:50:06 【问题描述】:我正在尝试了解如何在 Apache Hive 中使用 rank() over(partition by ),但在获得我想要的结果时遇到了问题。
帖子底部一直是我正在使用的数据集。
我要做的是提出一个声明,根据该部门员工的工资总和对部门进行唯一排名。但是,我在所有三个部门都获得了第一名。
希望有人能告诉我我哪里出错了!太感谢了! :)
我想要什么
+-----------+--------+-----+ |部门编号 | _c1 | rk | +-----------+--------+-----+ | 1000 | 24900 | 3 | | 1001 | 17400 | 1 | | 1002 | 20500 | 2 | +-----------+--------+-----+我得到了什么
+-----------+--------+-----+ |部门编号 | _c1 | rk | +-----------+--------+-----+ | 1000 | 24900 | 1 | | 1001 | 17400 | 1 | | 1002 | 20500 | 1 | +-----------+--------+-----+我正在使用的 HiveQL 语句
选择 部门编号,总和(工资), rank() OVER (PARTITION BY dept_num ORDER BY sum(salary)) as rk FROM employee_contract 按部门编号分组;我的数据集
迈克尔|1000|100|5000|满|2014-01-29 将|1000|101|4000|满|2013-10-02 将|1000|101|4000|部分|2014-10-02 史蒂文|1000|102|6400|零件|2012-11-03 露西|1000|103|5500|满|2010-01-03 百合|1001|104|5000|部分|2014-11-29 杰斯|1001|105|6000|零件|2014-12-02 迈克|1001|106|6400|零件|2013-11-03 卫|1002|107|7000|零件|2010-04-03 云|1002|108|5500|满|2014-01-29 理查德|1002|109|8000|满|2013-09-01【问题讨论】:
如果您将salary
的 SUM() 更改为通过子查询计算,它是否按预期工作?还是一样的结果?
【参考方案1】:
试试下面的一个,未经测试,让我们知道你得到了什么
SELECT dept_num,TOTAL_SALARY,
rank() OVER (ORDER BY TOTAL_SALARY) as rk
FROM
(
SELECT
dept_num, sum(salary) as TOTAL_SALARY
FROM employee_contract
GROUP BY dept_num
)SUM_EMP
【讨论】:
非常感谢! :) 是的,它有效! :) snag.gy/EIRZ8z.jpg 如果你有时间,你能解释一下为什么我原来的 HiveQL 不起作用,或者更确切地说,我是如何误解了 PARTITION BY 的工作方式?谢谢! PARTITION BY 与 GROUP BY 相同/等效。如果 dept_num 相同,您的 HQL 查询将给出相同的结果。这里的 dept_num 对于每一行都是不同的。因此给 rk=1以上是关于Hive 问题 - Rank() OVER (PARTITION BY Dept ORDER BY sum(salary))的主要内容,如果未能解决你的问题,请参考以下文章
mysql窗口函数rank() over、dense_rank() over、row_number() over 使用心得
MySQL - 排序函数 Rank() Over()Dense_rank() Over()Row_number() Over()