开发者社区> 问答> 正文

如何使用spark scala计算目录中存在的多个文件的单词

如何使用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(),但没有给我文件名。

展开
收起
社区小助手 2018-12-06 13:52:09 2552 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    该方法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]),因为你正在一次性加载文件的全部内容。

    2019-07-17 23:18:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spark Streaming At Bing Scale 立即下载
Apache Spark: Cloud and On-Prem 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载