gpt4 book ai didi

scala - 为什么在reduce中使用sqrt结果不一致?

转载 作者:行者123 更新时间:2023-12-01 18:32:55 24 4
gpt4 key购买 nike

考虑 Spark 中的以下代码,它应返回整数序列的 sqrt 之和:

// Create an RDD of a sequence of integers
val data = sc.parallelize(Range(0,100))

// Transform RDD to sequence of Doubles
val x = data.map(_.toDouble)

// Reduce the sequence as the sum of the sqrt of each integer
// (repeated 10 times with each result stored as a kv pair)
val xReduceMultipleTimes = Range(0,10).map(n=>(n, x.reduce((x,y)=>x+Math.sqrt(y))))

reduce 操作在同一个 RDD 上按顺序重复多次,并且每次都应返回相同的结果。但是,我从 Spark 获得的输出不一致,并且远未达到正确值。

xReduceMultipleTimes: scala.collection.immutable.IndexedSeq[(Int, Double)] =
Vector((0,105.44288170056565), (1,245.5267945723869), (2,190.04459651854287),
(3,233.32211443903282), (4,190.04459651854287), (5,105.44288170056566),
(6,273.5022316153404), (7,105.44288170056568), (8,105.44288170056566),
(9,205.51799497636216))

经 Mathematica 验证,正确结果应为 661.463

y 替换 Math.sqrt(y) 会产生正确且一致的无根整数之和(即 4950)。

关于可能导致不一致的原因有什么想法吗?

最佳答案

平方根不具有结合律。请记住,reduce 做了两件事,它首先在本地减少,其中第一个参数确实是累加器,第二个参数是新值。它所做的下一步是合并中间结果,这会导致累加器添加到节点值的平方根......这不是您想要的。为此,您必须使用aggregate

rdd.aggregate(0)((accum, value) => accum + Math.sqrt(value), _ + _)

我相信这捕获了您的意图。第一个参数是 0 的种子,然后是在每个节点上本地运行的函数。那么加法只是将节点相加,不需要开平方。

关于scala - 为什么在reduce中使用sqrt结果不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30810652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com