【发布时间】:2016-05-14 07:20:54
【问题描述】:
在 Spark 的文档中,它说 RDDs 方法 reduce 需要关联 AND 可交换二进制函数。
但是,reduceByKey 方法只需要关联二元函数。
sc.textFile("file4kB", 4)
我做了一些测试,显然这是我得到的行为。为什么会有这种差异?为什么reduceByKey 确保二进制函数始终以特定顺序应用(以适应缺乏交换性)而reduce 不这样做?
例如,如果加载一些具有 4 个分区(最少)的(小)文本:
val r = sc.textFile("file4k", 4)
然后:
r.reduce(_ + _)
返回一个字符串,其中部分的顺序并不总是相同,而:
r.map(x => (1,x)).reduceByKey(_ + _).first
总是返回相同的字符串(其中所有内容的顺序与原始文件中的顺序相同)。
(我检查了r.glom,文件内容确实分布在4个分区,没有空分区)。
【问题讨论】:
-
我猜
reduceByKey的想法是您可能有很多不同的键,因此可以在单个线程上减少单个键的所有内容,这意味着您始终可以运行计算左到右。相比之下,reduce经常用于大型数据集,因此不必关心操作顺序。 -
您在实验中使用了多少个执行器?
标签: scala apache-spark rdd reduce