尝试通过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
任何想法为什么?或者更好的方法?
谢谢!
答案 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
替换为您的规则,例如按用户排序。