HIVE調優之去重統計


SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;

對一個表中符合條件的記錄統計不重復的id的總數。由於引入了DISTINCT,因此在Map階段無法利用combine對輸出結果消重,必須將id作為Key輸出,在Reduce階段再對來自於不同Map Task、相同Key的結果進行消重,計入最終統計值。作業運行時的Reduce Task個數為1,對於統計大數據量時,這會導致最終Map的全部輸出到單個ReduceTask處理。這唯一的Reduce Task需要Shuffle大量的數據,並且進行排序聚合等處理,這使得它成為整個作業的IO和運算瓶頸

 

改進:

SELECT COUNT(*) FROM (SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t;

利用Hive對嵌套語句的支持,將原來一個MapReduce作業轉換為兩個作業,在第一階段選出全部的非重復id,在第二階段再對這些已消重的id進行計數。這樣在第一階段我們可以通過增大Reduce的並發數,並發處理Map輸出。在第二階段,由於id已經消重,因此COUNT(*)操作在Map階段不需要輸出原id數據,只輸出一個合並后的計數即可


免責聲明!

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



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