在蜂巢中排名()

时间:2013-01-08 16:48:19

标签: sql-server hadoop hive

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

我如何转换如下内容:

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

3 个答案:

答案 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)