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

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,也能打印。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章