2

我正在将 SQL Server 存储过程转换为 HiveQL。

我怎样才能转换类似的东西:

SELECT 
    p.FirstName, p.LastName,
    RANK() OVER (ORDER BY a.PostalCode) AS Rank
4

3 回答 3

7

我已经看过这个用例几次了,有一种方法可以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
于 2013-01-08T16:57:31.630 回答
2

对于遇到此问题的任何人,Hive 现在支持 rank() 和其他分析函数。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

于 2015-01-16T23:15:22.910 回答
0

没什么大不了的,在 Hive 0.13.1 中,逗号不起作用:-(

所以我不用逗号就可以正常工作

(PARTITION BY category country ORDER BY sales DESC)

于 2015-02-04T18:34:05.993 回答