我正在将SQL Server存储过程转换为HiveQL。
我如何转换如下内容:
SELECT
p.FirstName, p.LastName,
RANK() OVER (ORDER BY a.PostalCode) AS Rank
答案 0 :(得分:6)
我已经多次看过这个用例,有一种方法可以使用UDF在Hive中执行与RANK()
类似的操作。
基本上有几个步骤:
DISTRIBUTE BY
SORT BY
实际上有a nice article on the topic,你也可以找到Edward Capriolo here的一些代码。
以下是在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
答案 1 :(得分:2)
对于遇到此问题的任何人,Hive现在支持rank()和其他分析功能。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics
答案 2 :(得分:0)
没什么大不了的 不知何故,在Hive 0.13.1中,逗号不起作用:-(
所以我在没有逗号的情况下使用它
(PARTITION BY category country ORDER BY sales DESC)