我有一个包含多行文本的文本文件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解释器会将两者都转换为最有效的形式吗?

最佳答案

我认为最常见的处理方式是mapsum:

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

但总的来说,总费用将由line.split(" ")决定。

通过手动遍历字符串并计算连续的空格而不是构建新的Array,您可能会做得更好一些,但我怀疑这样做是否值得大惊小怪。

如果您希望更深入地了解 count is defined as:
def count(): Long = sc.runJob(this, Utils.getIteratorSize _).sum

其中Utils.getIteratorSize几乎是Iterator的幼稚迭代,具有和和 sum is equivalent to的总和
_.fold(0.0)(_ + _)

关于scala - FlatMap vs Map的效率,其次是Spark的降低,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36305580/

10-13 00:30