複習:聊聊hive隨機採樣①

640?wx_fmt=png

數據量大的時候,對數據進行採樣,而後再作模型分析。做爲數據倉庫的必備品hive,咱們如何對其進行採樣呢?html

固然,浪尖寫本文還有另外一個目的就是複習hive的四by。不止是否有印象呢?性能優化

Hive : SORT BY vs ORDER BY vs DISTRIBUTE BY vs CLUSTER BYide

歡迎點擊閱讀原文,加入浪尖知識星球。性能

640?wx_fmt=png

 
 

若是不對錶進行排序,Hive不保證數據的順序,但在實踐中,它們按照它們在文件中的順序返回,因此這遠非真正隨機。那麼接着能夠嘗試:優化

 
 

這確實提供了真正的隨機數據,但性能並非那麼好。爲了實現總排序,Hive必須將全部數據強制傳輸到單個reducer。該reducer將對整個數據集進行排序。這很很差。幸運的是,Hive有一個非標準SQL「sort by」子句,它只在單個reducer中排序,而且不保證數據跨多個reducers中排序:url

 
 

這要好得多,但我不相信它真的是隨機的。問題是Hive的將數據拆分爲多個reducer的方法是未定義的。它多是真正隨機的,它可能基於文件順序,它可能基於數據中的某些值。Hive如何在reducers中實現limit子句也是未定義的。也許它按順序從reducer中獲取數據 - 即,reducer 0中的全部數據,而後所有來reducer1,等等。也許它經過它們循環並將全部內容混合在一塊兒。spa

在最壞的狀況下,假設reduce 的key是基於數據列,而limit子句是reducers的順序。而後樣品會很是傾斜。.net

解決方案是另外一個非標準的Hive功能:「distribute by」。對於reduce key不是由查詢結構肯定的查詢(沒有「group by」,沒有join),能夠準確指定reduce key的內容。若是咱們隨機分佈,並在每一個reducer中隨機排序,那麼「limit」功能如何可有可無。code

 
 

最後,做爲最後一次優化,能夠在map-side作一些過濾。若是表的總大小是已知的,全球高校排名輕鬆設置一個隨機閾值條件來進行數據過濾,以下所示:htm

 
 

在這種狀況下,因爲總大小是100億,樣本大小是一萬,我能夠很容易地計算出樣本佔總數據的0.000001。可是,若是where子句是「rand()<0.000001」,則最終輸出的行數可能少於10000行。「rand()<0.000002」可能會起做用,但這確實依賴於rand()有很是好的實現。最後它並不重要,由於瓶頸是全表掃描,而不是傳輸給reducer的這點數據。

推薦閱讀:

Hive不爲人知的寶石-Hooks

Hive性能優化(全面)

不可不知的spark shuffle

640?wx_fmt=png


文章來源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/82121139

相關文章
相關標籤/搜索