sql server语言 - rank() over in hive



我正在将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中,逗号不工作:-(

)

没有逗号

也能正常运行

(按类别国家划分)

最新更新