計算reducer id用int所帶來的問題

2021-09-25 09:06:35 字數 736 閱讀 1641

最近在為某行的資料進行構建cube過程中,遇到5億的資料丟失一條資料導致構建失敗的情況,讓人摸不著頭腦,該條資料為"539019926",剛開始並沒有考慮到是數字的特殊性導致的問題,但是在實驗室中無論用多大基數的資料量都無法復現此問題,實在是讓人摸不著頭腦。

慢慢的我開始懷疑這個數字是特殊的,為啥構建這麼多次只有它出錯了,只保留一條這一條資料來進行驗證。驗證結果是,通過該條資料的hashcode來計算的reducerid竟然是負數,

什麼鬼,

int reduceid = begin + math.abs(hash) % span;

這是我們算reduceid的公式,我abs了啊,沒有理由為負數。但是很巧合的是,這個數字的hashcode竟然等於integer.min_value,abs(integer.min_value)=integer.min_value。理由如下(負數等於取反碼加1):

-2147483648的二進位制正碼:10000000000000000000000000000000

-2147483648的二進位制反碼:01111111111111111111111111111111

-2147483648的二進位制反碼+1:10000000000000000000000000000000

解決方法很簡單,轉換成long,或者是& integer.max_value;

所以以後還是要注意,通過hashcode去算reduceid或者partitionid時,要謹防此類問題

用乙個 int 表示 IP位址

用乙個 int 表示 ip位址。這還是08年初,面試華為時被問到的,當時也回答上來了。不過,最終 hr 也沒要我就是了 public class ip2integer else system.out.println iipv4 sb.tostring return sb.tostring conve...

int64可以用什麼輸入

電壓電流採集模組是一種通用型資料採集模組,如dam 8021,dam 7011,內嵌高效能arm處理器,針對工業自動化控制場景而設計,採用電源 測量 通訊互相隔離等技術,輸入端採用esd 過壓 過流保護等設計,具有效能穩定 抗干擾性強等特點。電壓電流採集模組含有十六路隔離型開關量輸入 四路模擬電壓輸...

用int型別表示最大公倍數

include include includeint main void sum m n a printf 最小公倍數 d n sum printf int型別的極限為 d n int max q int max sum printf 最大公倍數是 d n sum q return 0 最大公倍數好...