在Spark的文档中,它说RDDs方法
然而,方法
我做了一些测试,显然这是我得到的行为。为什么会有这种差异?为什么
例如,如果加载一些(小)文本并将其分为4个分区(最小值):
返回一个字符串,其中的部分不总是按相同的顺序排列,而:
始终返回相同的字符串(其中所有内容与原始文件中的顺序相同)。
(我使用进行了检查,文件内容确实分布在4个分区上,没有空分区)。
reduce
需要一个满足结合律和交换律的二元函数。然而,方法
reduceByKey
仅需要一个满足结合律的二元函数。sc.textFile("file4kB", 4)
我做了一些测试,显然这是我得到的行为。为什么会有这种差异?为什么
reduceByKey
可以确保二元函数始终按照特定顺序应用(以适应缺乏可交换性的情况),而reduce
则不能?例如,如果加载一些(小)文本并将其分为4个分区(最小值):
val r = sc.textFile("file4k", 4)
然后:
r.reduce(_ + _)
返回一个字符串,其中的部分不总是按相同的顺序排列,而:
r.map(x => (1,x)).reduceByKey(_ + _).first
始终返回相同的字符串(其中所有内容与原始文件中的顺序相同)。
(我使用进行了检查,文件内容确实分布在4个分区上,没有空分区)。
reduceByKey
的想法是你可能有很多不同的键,所以将单个键的所有内容缩减到单个线程上是可以的,这意味着您始终可以从左到右运行计算。相比之下,reduce
经常用于大型数据集,因此不必关心操作顺序。 - Rex Kerr