2016-09-14 40 views
0

试图通过rank函数在hive sql中执行动态限制。在HiveQL中使用RANK,动态限制

问题: 我想使用表A的限制来创建输出。下面的例子。

表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 

OUTPUT:

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

可惜你不能d o 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

在表b中没有被称为限制的列,并且在表a中没有列用户 –

+0

修复了......对不起,只是一个错字。仍然是同样的问题。 – ChrisD

+0

为什么没有'分区'? 'rank()通过b.id ORDER BY b.id DESC'PARTITION'' – leftjoin

回答

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,例如用户订购。

+0

请用解释编辑你的答案,或者如果你不能解释代码,请提供有用的链接,但这不是首选,因为链接可能会过期或内容可能会改变。你应该避免发布满足“给予代码”问题规则的答案。 – xinaiz