flatMap与map的效率之后是Spark中的reduce

时间:2016-03-30 10:04:50

标签: scala apache-spark mapreduce rdd flatmap

我有一个包含多行文本的文本文件sherlock.txt。我使用:

将它加载到spark-shell中
val textFile = sc.textFile("sherlock.txt")

我的目的是计算文件中的单词数。我找到了两种替代方法来完成这项工作。

首先使用flatMap:

textFile.flatMap(line => line.split(" ")).count()

第二个使用map,然后是reduce:

textFile.map(line => line.split(" ").size).reduce((a, b) => a + b)

两者都能正确地产生相同的结果。我想知道上述两种替代实现的时间和空间复杂性的差异,如果确实存在任何?

scala解释器是否将两者转换为最有效的形式?

1 个答案:

答案 0 :(得分:5)

我认为最常用的处理方法是mapsum

textFile.map(_.split(" ").size).sum

但是在一天结束时,总费用将由line.split(" ")支配。

你可以通过手动迭代字符串并计算连续的空格而不是构建新的Array来做得更好一些,但我怀疑一般情况下值得大惊小怪。

如果您更喜欢深入了解count is defined as

def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum  

其中Utils.getIteratorSizeIterator相比是一个天真的迭代,其总和为1 sum is equivalent to

_.fold(0.0)(_ + _)