2016-07-07 53 views
0

我试图做星火一个简单的MR工作,这里是代码:如果什么reduceByKey( - + - )的结果超出INT范围

val testRDD = someRDD.map((_, 1)).reduceByKey(_+_) 

在地图阶段,价值为int ,如果在减少阶段,该值太大而超出Int范围?我可以这样做

val testRDD = someRDD.map((_, 1.toLong)).reduceByKey(_+_) 

但是有没有更好的想法?

回答

2

Nothing Spark specific。这只会导致integer overflow

sc.parallelize(Seq(("a", Integer.MAX_VALUE), ("a", 1))).reduceByKey(_ + _).first 

// (String, Int) = (a,-2147483648) 

如果您怀疑可能发生溢出错误你绝对应该使用更合适的数据类型和Long是整数值不错的选择:

sc.parallelize(Seq(
    ("a", Integer.MAX_VALUE.toLong), ("a", 1L) 
)).reduceByKey(_ + _).first 

// (String, Long) = (a,2147483648)