我有一个包含多行文本的文本文件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解释器是否将两者都转换为最有效的形式?
解决方法
我认为处理这个问题最常用的方法是映射和求和:
textFile.map(_.split(" ").size).sum
但是在一天结束时,总费用将由line.split(“”)主导.
通过手动迭代字符串并计算连续的空格而不是构建新的数组,你可能会做得更好一点,但我怀疑它是值得所有的大惊小怪.
如果你更喜欢一点点深入了解count
is defined as:
def count(): Long = sc.runJob(this,Utils.getIteratorSize _).sum
Utils.getIteratorSize与Iterator相比是一个天真的迭代,其中包含一个和sum
is equivalent to的总和
_.fold(0.0)(_ + _)