在 HiveQL 中使用 RANK,动态限制
Using RANK in HiveQL, dynamic limits
正在尝试通过 rank 函数在配置单元 sql 中执行动态限制。
问题:
我想使用 table A 对 table B 的限制来创建输出。示例如下。
TABLE答:
ID | Limit
------------
123 | 1
456 | 3
789 | 2
TABLE乙:
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
知道为什么吗?或者更好的方法?
谢谢!
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
替换为您的规则,例如按用户排序。
正在尝试通过 rank 函数在配置单元 sql 中执行动态限制。
问题: 我想使用 table A 对 table B 的限制来创建输出。示例如下。
TABLE答:
ID | Limit
------------
123 | 1
456 | 3
789 | 2
TABLE乙:
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
知道为什么吗?或者更好的方法?
谢谢!
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
替换为您的规则,例如按用户排序。