加粗樣式@toc
(1)hashmap不是執行緒安全的,concurrenthashmap是執行緒安全的
(2)利用key的hashcode重新hash計算出當前物件的元素在陣列中的下標
(3)儲存時,如果出現hash值相同的key,此時有兩種情況。(1)如果key相同,則覆蓋原始值;(2)如果key不同(出現衝突),則將當前的key-value放入鍊錶中
(4)獲取時,直接找到hash值對應的下標,在進一步判斷key是否相同,從而找到對應值。
(5)理解了以上過程就不難明白hashmap是如何解決hash衝突的問題,核心就是使用了陣列的儲存方式,然後將衝突的key的物件放入鍊錶中,一旦發現衝突就在鍊錶中做進一步的對比。
(1)業務邏輯,我們從業務邏輯層面上來優化資料傾斜,比如就說訂單場景吧,我們在某一天在北京和上海兩個城市多了強力的推廣,結果可能是這兩個城市的訂單量增長了10000%,其餘城市的資料量不變。然後我們要統計不同城市的訂單情況,這樣,一做group操作,可能直接就資料傾斜了,我們單獨對兩個城市來做count,最後和其它城市做整合。
有損的方法:
找到異常資料,比如ip為0的資料,過濾掉
無損的方法:
對分布不均勻的資料,單獨計算
先對key做一層hash,先將資料打散讓它的並行度變大,再匯集
(2)程式層面,比如說在hive中,經常遇到count(distinct)操作,這樣會導致最終只有乙個reduce,我們可以先group再在外麵包一層count,就可以了。
(3)調參方面,hadoop和spark都自帶了很多引數來調節資料傾斜,合理利用它們就能解決大部分問題。
spark平台:
1.mapjoin或者採用broadcast join
2.設定rdd壓縮
3.合理設定driver和exector記憶體
hadoop平台:
1.mapjoin方式
2.count distinct操作,先轉成group,再count
3.hive.groupby.skewindata=true
4.left semi join的使用
5.設定map端輸出。中間結果壓縮。
面試題積累
1.hashmap.put hashmapmap new hashmap string aa1 map.put aa 11 string aa2 map.put aa 22 system.out.println aa1 aa1 system.out.println aa2 aa2 結果 aa1 nu...
面試題積累 前端
1 主流瀏覽器及使用的核心 ie trident chrome webkit firefox gecko safari webkit 1 ie瀏覽器核心 trident核心 也稱ie核心 2 chrome瀏覽器核心 webkit核心 或答blink核心 3 firefox瀏覽器核心 gecko核心 ...
前端面試題積累
1 工廠模式 在函式裡,new 乙個 object,然後根據傳入的引數給該物件新增屬性,最後返回該物件。問題 無法知道乙個物件的型別。2 建構函式模式 問題 每個方法都要在每個例項上重新建立一遍。解決 在全域性作用域中定義全域性函式。當然,這會導致封裝性很差。3 原型模式 每個函式都有乙個 prot...