小編給大家分享一下報(bào)表連hive時(shí)數(shù)據(jù)量比較大如何分頁(yè)查詢(xún),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)成立10年來(lái),這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、國(guó)際域名空間、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。網(wǎng)站是否美觀、功能強(qiáng)大、用戶體驗(yàn)好、性?xún)r(jià)比高、打開(kāi)快等等,這些對(duì)于網(wǎng)站建設(shè)都非常重要,創(chuàng)新互聯(lián)通過(guò)對(duì)建站技術(shù)性的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
Hive 提供了類(lèi)似 Oracle 的 rownum 機(jī)制,類(lèi)似這樣(效率比較差):
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;
還有一種辦法,如果表里有唯一標(biāo)識(shí)字段也可以借助這個(gè)字段和 limit 實(shí)現(xiàn)。比如:
獲取第一頁(yè)數(shù)據(jù):
注:同時(shí)需要記錄這 10 條中最大的 id 為 preId,作為下一頁(yè)的條件。
select * from table order by id asc limit 10;
獲取第二頁(yè)數(shù)據(jù):
注:同時(shí)保存數(shù)據(jù)中最大的 id 替換 preId。
select * from table where id >preId order by id asc limit 10;
對(duì)于數(shù)據(jù)庫(kù)分頁(yè), 這里曾經(jīng)分析過(guò)存在的問(wèn)題
大清單報(bào)表應(yīng)當(dāng)怎么做? 也給出了改善的思路,可以參考:
把取數(shù)和呈現(xiàn)做現(xiàn)兩個(gè)異步線程,取數(shù)線程發(fā)出 SQL 后就不斷取出數(shù)據(jù)后緩存到本地存儲(chǔ)中,呈現(xiàn)線程根據(jù)頁(yè)數(shù)計(jì)算出行數(shù)到本地緩存中去獲取數(shù)據(jù)顯示。這樣,只要已經(jīng)取過(guò)的數(shù)據(jù)就能快速呈現(xiàn),不會(huì)有等待感,還沒(méi)取到的數(shù)據(jù)需要等待一下也是正??衫斫獾?;而取數(shù)線程只涉及一句 SQL,在數(shù)據(jù)庫(kù)中是同一個(gè)事務(wù),也不會(huì)有不一致的問(wèn)題。這樣,兩個(gè)問(wèn)題都能得到解決。不過(guò)這需要設(shè)計(jì)一種可以按行號(hào)隨機(jī)訪問(wèn)記錄的存儲(chǔ)格式,不然要靠遍歷把記錄數(shù)出來(lái),那反應(yīng)仍然會(huì)很遲鈍。
畫(huà)個(gè)圖感受感受:
②和③分別是兩個(gè)線程,一個(gè)負(fù)責(zé)取數(shù)緩存,一個(gè)負(fù)責(zé)讀緩存做報(bào)表呈現(xiàn)
看起來(lái)有點(diǎn)復(fù)雜,可直接用做好的工具:
海量清單與分組報(bào)表的實(shí)現(xiàn)
還能導(dǎo)出 Excel,也能打印。
看完了這篇文章,相信你對(duì)“報(bào)表連hive時(shí)數(shù)據(jù)量比較大如何分頁(yè)查詢(xún)”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!