【问题标题】:reduce function gives negative answerreduce 函数给出否定的答案
【发布时间】: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


【解决方案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

【讨论】:

  • 感谢您的示例成功!我对其进行了一些调整,以便在没有 toString 的情况下使用 inputRDD.map(x => scala.BigInt(x)) 并显示相同的结果(以防万一):)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
相关资源
最近更新 更多