我正在将 SQL Server 存储过程转换为 HiveQL。
我怎样才能转换类似的东西:
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
我正在将 SQL Server 存储过程转换为 HiveQL。
我怎样才能转换类似的东西:
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
我已经看过这个用例几次了,有一种方法可以RANK()
在 Hive 中使用 UDF 做类似的事情。
基本上有几个步骤:
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 中,逗号不起作用:-(
所以我不用逗号就可以正常工作
(PARTITION BY category country ORDER BY sales DESC)