【发布时间】:2016-01-16 12:11:56
【问题描述】:
朋友们,
到目前为止,我正在尝试学习 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”。如果我尝试在 reduce 中使用“+”而不是“*”,我会得到正确的总和,但不是这样。我还尝试将结果转换为 Int、String 和 Long
【问题讨论】:
-
你试过计算实际结果吗?它可能溢出了。
-
乘积为 228235320014929920000 不适合 32 位或 64 位整数,所以确实溢出了。
-
所以如果我仍然确实必须将所有这些数字相乘并返回结果,是否可以使用其他数据类型或方法?
-
我认为 scala 有一个 BigInteger。我认为他们包装了 Java。
-
将列表映射到 BigInts 列表,然后并行化和归约。或者您可能只是将 BigInt (1) 作为种子值传递给
reduce。同上。我不在电脑前。
标签: scala apache-spark reduce