在蜂巢中排名()

MBZ*_*MBZ 2 sql-server hadoop hive

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

我怎样才能转换如下内容:

SELECT 
    p.FirstName, p.LastName,
    RANK() OVER (ORDER BY a.PostalCode) AS Rank
Run Code Online (Sandbox Code Playgroud)

Cha*_*guy 6

我已经看过几次这个用例,有一种方法可以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
Run Code Online (Sandbox Code Playgroud)

这相当于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
Run Code Online (Sandbox Code Playgroud)