我是新来的火花。我已经执行了以下Spark程序
val spark = SparkSession.builder().appName("FoldFunction").master("local").getOrCreate()
val data = spark.sparkContext.parallelize(List(("Maths", 10), ("English", 10), ("Social", 10), ("Science",10)))
val extraMarks = ("extra", 10)
val foldedData = data.fold(extraMarks){ (acc, marks) => val add = acc._2 + marks._2
("total", add)}
println(foldedData)
根据我的分析,代码会将10分加到总分中。但是我得到的答案是(total,60)
。
有人可以解释我的分析方法是否正确吗?
答案 0 :(得分:0)
api文档显示以下内容
* @param zeroValue the initial value for the accumulated result of each partition for the
opoperator, and also the initial value for the combine results from different partitions for the
opoperator - this will typically be the neutral element (e.g.
无for list concatenation or
0for summation) * @param op an operator used to both accumulate results within a partition and combine results from different partitions */ def fold(zeroValue: T)(op: (T, T) => T): T
通常将zeroValue
设置为0
或Nil
但是您的zeroValue
是("extra", 10)
,它是在上一次累积过程中再次添加的,这就是您如何获得(total,60)
让我们一步一步走
起初acc
是(extra,10)
marks
是(Maths,10)
,所以 10 + 10 = 20 即(total, 20)
第二个acc
是(total,20)
marks
是(English,10)
,所以 20 + 10 = 30 即(total, 30)
第三个acc
是(total,30)
marks
是(Social,10)
,所以 30 + 10 = 40 即(total, 40)
第四个acc
是(total,40)
marks
是(Science,10)
,所以 40 + 10 = 50 即(total, 50)
累积将zeroValue
(extra,10)
与folded
(total,50)
相加,因此 10 + 50 = 60 即(total, 60)