火花壳内部reduce功能的内部

时间:2019-04-21 11:07:50

标签: apache-spark spark-shell

输入文件包含20行。我正在尝试使用reduce函数计算记录总数。谁能解释一下为什么结果有差异?因为这里的y值仅是1。

默认分区数:4

scala> rdd = sc.textFile("D:\LearningPythonTomaszDenny\Codebase\\wholeTextFiles\\names1.txt")
scala> rdd.map(x=>1).reduce((acc,y) => acc+1)
res17: Int = 8

scala> rdd.map(x=>1).reduce((acc,y) => acc+y)
res18: Int = 20

1 个答案:

答案 0 :(得分:0)

  

因为这里y的值仅是1。

那根本不是真的。 reduce包含三个阶段(严格意义上不是Spark的意思):

  • 每个分区上的分布式缩减。
  • 将部分结果收集到驱动程序中(同步或异步,取决于后端)。
  • 减少本地驱动程序。

在您的情况下,第一阶段和第二阶段的结果是相同的,但是第一种方法只会忽略部分结果。换句话说,不管分区的结果是什么,它总是只加1。

这种方法仅适用于非并行,非顺序reduce实现。