2016-09-14 58 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