報表連 hive,資料量比較大,怎麼分頁查詢?

xiaohuihui發表於2020-06-23

Hive 提供了類似 Oracle 的 rownum 機制,類似這樣(效率比較差):

select * from (select row_number() over (order by create_time desc) as rownum,u.* from user u) mm where mm.rownum between 10 and 15;

還有一種辦法,如果表裡有唯一標識欄位也可以藉助這個欄位和 limit 實現。比如:
獲取第一頁資料:
注:同時需要記錄這 10 條中最大的 id 為 preId,作為下一頁的條件。

select * from table order by id asc limit 10;

獲取第二頁資料:
注:同時儲存資料中最大的 id 替換 preId。

select * from table where id >preId order by id asc limit 10;

對於資料庫分頁, 這裡曾經分析過存在的問題 也給出了改善的思路,可以參考:
把取數和呈現做現兩個非同步執行緒,取數執行緒發出 SQL 後就不斷取出資料後快取到本地儲存中,呈現執行緒根據頁數計算出行數到本地快取中去獲取資料顯示。這樣,只要已經取過的資料就能快速呈現,不會有等待感,還沒取到的資料需要等待一下也是正常可理解的;而取數執行緒只涉及一句 SQL,在資料庫中是同一個事務,也不會有不一致的問題。這樣,兩個問題都能得到解決。不過這需要設計一種可以按行號隨機訪問記錄的儲存格式,不然要靠遍歷把記錄數出來,那反應仍然會很遲鈍。

畫個圖感受感受:

imagepng
②和③分別是兩個執行緒,一個負責取數快取,一個負責讀快取做報表呈現

看起來有點複雜,可直接用做好的工具:
還能匯出 Excel,也能列印。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2700099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章