Hive中實現SELECT TOP N的方法


TOP N是實現最大/小N條數據。

鑒於Hive提供了limit關鍵字,配合排序功能就很容易實現了。

但是Hive中order by只能生成1個reduce,如果表的數據量太大,order by 就會有心無力

例如SQL:select a from t_test order by a limit 10;

控制台會輸出:Number of reduce tasks determined at compile time: 1

說明啟動的reduce數是編譯時決定的,查看該SQL的執行計划,發現只啟動1個Job

如果表數據量非常大,而我們只想取Top 10,那么這么做就非常不合理

 

這樣就可以考慮sort by ,就可以解決這個問題了

select a from t_test sort by a limit 10;

控制台會輸出:Number of reduce tasks not specified. Estimated from input data size: 1

說明reduce數不是編譯時決定的,而是根據輸入的文件大小動態決定的。

sort by可以啟動多個reduce,每個reduce做局部排序,這對於sort by limit N已經夠了。

從執行計划來看,sort by limit N啟動了兩個Job,第一個Job在每個reduce中做局部排序,分別取出Top N,然后第二個Job做全局排序,取出Top N得出想要的結果。

假設:第一個Job啟動了x個reduce,第二個Job對x個reduce排好序的x * N條數據做全局排序,取Top N ,從而得到想要的結果。

這樣就大大提升了select 效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM