我正在将SQL Server存储过程转换为HiveQL。
如何转换:
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
我见过这个用例几次,有一种方法可以在Hive中使用UDF做类似于RANK()
的事情。
基本上有几个步骤:
- 用
DISTRIBUTE BY
将数据分组 - 用
SORT BY
对各组数据排序
实际上有一篇关于这个主题的好文章,你也可以在这里找到Edward Capriolo的一些代码。
下面是一个在Hive中进行排序的示例查询:
ADD JAR p-rank-demo.jar;
CREATE TEMPORARY FUNCTION p_rank AS 'demo.PsuedoRank';
SELECT
category,country,product,sales,rank
FROM (
SELECT
category,country,product,sales,
p_rank(category, country) rank
FROM (
SELECT
category,country,product,
sales
FROM p_rank_demo
DISTRIBUTE BY
category,country
SORT BY
category,country,sales desc) t1) t2
WHERE rank <= 3
相当于MySQL中的以下查询:
SELECT
category,country,product,sales,rank
FROM (
SELECT
category,country,product, sales,
rank() over (PARTITION BY category, country ORDER BY sales DESC) rank
FROM p_rank_demo) t
WHERE rank <= 3
对于遇到这个问题的人,Hive现在支持rank()和其他分析功能。https://cwiki.apache.org/confluence/display/Hive/LanguageManual + WindowingAndAnalytics
没什么大不了的在Hive 0.13.1中,逗号不工作:-(
)没有逗号
也能正常运行(按类别国家划分)