在 Spark 的文档中,它说 RDDs 方法reduce http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD需要一个结合与交换的二元函数。
然而,该方法reduceByKey http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions仅需要关联二元函数。
sc.textFile("file4kB", 4)
我做了一些测试,显然这就是我得到的行为。为什么会有这样的差异?为什么reduceByKey
确保二元函数始终按特定顺序应用(以适应交换律的缺乏)reduce
才不是?
例如,如果加载一些具有 4 个分区(最少)的(小)文本:
val r = sc.textFile("file4k", 4)
then:
r.reduce(_ + _)
返回一个字符串,其中各部分的顺序并不总是相同,而:
r.map(x => (1,x)).reduceByKey(_ + _).first
始终返回相同的字符串(其中所有内容的顺序与原始文件中的顺序相同)。
(我检查过r.glom
并且文件内容确实分布在4个分区上,不存在空分区)。