在HiveQL中使用RANK,动态限制

时间:2016-09-14 19:25:49

标签: hadoop hive hiveql rank

尝试通过rank函数在hive sql中执行动态限制。

问题: 我想使用表A中的限制对表B来创建输出。示例如下。

表A:

 ID   | Limit
 ------------
 123  | 1
 456  | 3
 789  | 2

表B:

ID   | User
-------
123  | ABC
123  | DEF
123  | GHI
456  | JKL
456  | MNO
789  | PQR
789  | RST

输出:

ID   | User
----------
123  | ABC
456  | JKL
456  | MNO
789  | PQR
789  | RST

不幸的是,你不能在hive sql中做一个动态限制(据我所知)。所以我试图使用排名。我当前的查询如下所示:

SELECT c.id, c.users, c.rnk
FROM (
    SELECT b.id, b.user, a.limit, rank() over (ORDER BY b.id DESC) as rnk
    FROM a JOIN b
    ON a.id = b.id
    ) c
WHERE rnk < c.limit;

目前我收到错误:

ParseException line 3:9 cannot recognize input near 'rank' '(' ')' in from source 0

任何想法为什么?或者更好的方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

SELECT c.id, c.users, c.rnk
FROM (
    SELECT b.id, b.user, a.limit, row_number() over (PARTITION by b.id ORDER BY b.id ) as rn
    FROM a JOIN b
    ON a.id = b.id
    ) c
WHERE rn <= c.limit;

在上面的查询row_number()将在连接后对行进行编号,where子句中的过滤器将作为限制。简单地限制没有任何偏好的行不需要ORDER BY,请将ORDER BY替换为您的规则,例如按用户排序。