如何使用Apache Spark with Scala执行目录中存在的多个文件的字数?
所有文件都有换行符分隔符。
O / p应该是:
file1.txt,5
file2.txt,6 ...
我尝试使用以下方式:
val rdd= spark.sparkContext.wholeTextFiles("file:///C:/Datasets/DataFiles/")
val cnt=rdd.map(m =>( (m._1,m._2),1)).reduceByKey((a,b)=> a+b)
O / p我得到了:
((file:/C:/Datasets/DataFiles/file1.txt,apple
orange
bag
apple
orange),1)
((file:/C:/Datasets/DataFiles/file2.txt,car
bike
truck
car
bike
truck),1)
我先尝试过sc.textFile(),但没有给我文件名。
该方法sparkContext.wholeTextFiles(...)为你提供了(file, contents)一对,因此当你通过键减少它时,您会得到(file, 1)因为这是每个对键具有的整个文件内容的数量。
为了计算每个文件的单词,您需要将每个文件的内容分成这些单词,以便计算它们。
我们在这里做,让我们开始阅读文件目录:
val files: RDD[(String, String)] = spark.sparkContext.wholeTextFiles("file:///C:/Datasets/DataFiles/")
这为每个文件提供了一行,以及完整的文件内容。现在让我们将文件内容分解为单个项目。鉴于你的文件似乎每行有一个单词,使用换行符非常简单:
val wordsPerFile: RDD[(String, Array[String])] = files.mapValues(_.split("n"))
现在我们只需要计算每个项目中存在的项目数量Array[String]:
val wordCountPerFile: RDD[(String, Int)] = wordsPerFile.mapValues(_.size)
这基本上就是这样。值得一提的是,虽然计数这个词根本没有被分发(它只是使用了Array[String]),因为你正在一次性加载文件的全部内容。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。