我正在尝试在Spark中做一个简单的MR工作,这是代码:
val testRDD = someRDD.map((_, 1)).reduceByKey(_+_)
在映射阶段,该值为 Int,如果在归约阶段,该值太大而超出 Int 范围怎么办?我大概可以这样做
val testRDD = someRDD.map((_, 1.toLong)).reduceByKey(_+_)
但是有更好的主意吗?
没有特定于 Spark 的内容。它只会导致整数溢出:
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)