计算reducer id用int所带来的问题

	最近在为某行的数据进行构建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时,要谨防此类问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值