2015-10-17 85 views
0

朋友,减少功能给出否定答案

我正在尝试学习Scala编码并探索reduce()函数截至目前。我不明白,为什么下面的代码块乘以列表中的所有号码给我负输出:

val inputRDD=sc.parallelize(List(1,2,3,3,4,5,6,7,8,9,19,22,21,25,34,56,4,32,56,70)) 

    val result=inputRDD.reduce((x,y)=>x*y) 

    println(result)` 

我得到的答案“-1619001344”当我运行上面的代码。如果我尝试在减少而不是“*”中使用“+”,我会得到适当的总和,但不会以其他方式。我也尝试将结果转换为Int,String和Long

+5

您是否尝试过计算实际结果?它可能是满溢的。 –

+2

该产品是228235320014929920000不适合32或64位整数,所以确实溢出。 – WhiteViking

+0

因此,如果我仍然_did_必须乘以所有这些数字并返回结果,是否有可能与其他数据类型或方法? –

回答

1

Int和Long类型都溢出,所以您需要使用BigInt进行此操作。

val inputRDD = sc.parallelize(List(1,2,3,3,4,5,6,7,8,9,19,22,21,25,34,56,4,32,56,70)) 

val inputRDDasBigInt = inputRDD.map(x => scala.BigInt(x)) 
val result = inputRDDasBigInt.reduce((x,y)=>x*y) 

println(result) 
228235320014929920000 
+0

感谢你的例子工作!我调整了一下,使用inputRDD.map(x => scala.BigInt(x)),没有使用toString,它显示了相同的结果(如果有帮助):) –

+0

让我补充说,修复谢谢! – marios