scala统计words.txt中的单词计数
时间: 2024-09-30 22:12:19 浏览: 23
在Scala中,你可以使用`scala.io.Source`来读取文件内容,然后通过`split`函数将文本分割成单词列表,再配合`foldLeft`或者`groupBy`等高阶函数来计算每个单词的频率。以下是一个简单的示例:
```scala
import scala.io.Source
object WordCount {
def main(args: Array[String]): Unit = {
val filename = "words.txt"
// 读取文件内容
val lines = Source.fromFile(filename).getLines().toList
// 使用flatMap转换每一行的单词,并去重
val words = lines.flatMap(line => line.split("\\W+").distinct)
// 使用foldLeft计算单词计数
val wordCounts = words.foldLeft(Map.empty[String, Int]) { (countMap, word) =>
countMap + (word -> (countMap.getOrElse(word, 0) + 1))
}
// 输出结果
wordCounts.foreach { case (word, count) => println(s"$word: $count") }
相关问题
import org.apache.flink.api.scala._ import org.apache.flink.api.scala.extensions._ object BatchWordCount { def main(args: Array[String]): Unit = { val env = ExecutionEnvironment.getExecutionEnvironment // 解析CSV文件,提取 message 列 val messages = env.readCsvFile[(String)]("/path/to/file.csv", ignoreFirstLine = true) .map(_._3) // 将消息按空格划分成单词 val words = messages.flatMap(_.split(" ")) // 计算每个单词的出现次数 val counts = words.map((_, 1)) .groupBy(0) .sum(1) // 打印结果 counts.print() } }
这段代码使用了 Flink 的 API 对CSV文件进行读取,并对文件中的单词进行计数。下面是代码的解释:
- 首先,通过 `ExecutionEnvironment.getExecutionEnvironment` 获取 Flink 执行环境。
- 然后,使用 `env.readCsvFile` 方法读取 CSV 文件,并将文件内容转换为 `(String)` 类型的元组。
- 接着,通过 `map` 方法提取元组的第三个元素,也就是 CSV 文件中的 message 列。
- 然后,使用 `flatMap` 方法将每个 message 按空格划分成单词。
- 接下来,对每个单词进行计数,使用 `map` 方法将每个单词映射为 `(单词, 1)` 的元组,然后使用 `groupBy` 方法按第 0 个元素(也就是单词)进行分组,最后使用 `sum` 方法对每个分组中的元素进行求和。
- 最后,使用 `print` 方法打印计数结果。
需要注意的是,代码中的路径 `/path/to/file.csv` 需要替换为实际的 CSV 文件路径。此外,代码中使用了 Scala 的扩展库,需要在项目中添加相应的依赖。
在桌面上创建这个data.txt文件,读取为RDD数据,data.txt的文件内容是hadoop is good, my name is chenhongcheng, scala ok ,spark is fast, spark is better,只统计每一行中包含3个单词的,一行中存在单词数不为3的不统计,将相同的单词放在一起,统计单词出现的次数,对计数得到的结果进行排序(由少到多),取出现字数倒数前2的单词及数量进行打印输出给出scala代码
好的,以下是对应的Scala代码:
```scala
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("WordCount").setMaster("local")
val sc = new SparkContext(conf)
val data = sc.textFile("data.txt")
.map(line => line.split(" "))
.filter(words => words.length == 3)
.flatMap(words => words)
.map(word => (word, 1))
.reduceByKey(_ + _)
.sortBy(_._2)
val top2Words = data.take(data.count().toInt - 2)
top2Words.foreach(word => println(word._1 + ": " + word._2))
}
}
```
解释一下代码:
1. 创建SparkConf和SparkContext对象;
2. 读取data.txt文件内容为RDD数据;
3. 对每一行的单词进行筛选,只统计每一行中包含3个单词的;
4. 将单词扁平化,以便于后续统计单词出现次数;
5. 统计单词出现次数,并按照次数从少到多排序;
6. 取出现字数倒数前2的单词及数量;
7. 打印输出结果。
注意:这里的代码是在本地模式下运行,如果需要在集群上运行,需要修改SparkConf的配置。
阅读全文