用scala Map写个词频统计

本文介绍如何使用Scala通过四种不同类型的Map实现单词统计功能,包括可变Map、不可变Map、已排序Map及按插入顺序输出的Map。每种方法都详细展示了具体的实现步骤。

1.使用可变map实现单词统计

//  这里要注意文件编码问题如果有中文要用UTF-8保存,最好文件统一使用utf-8保存
    val in = Source.fromFile("g:/a/1.txt")
    //  获取所有行
    val initer = in.getLines()
    import collection.mutable
    val m3 = mutable.Map[String, Int]()
    while (initer.hasNext) {
        val words = initer.next.split("\\s+")
        for (word <- words) {
            m3(word) = m3.getOrElse(word, 0) + 1
        }
    }
    in.close

2.使用不可变map实现单词统计

    var m4 = Map[String, Int]()
    val in1 = new java.util.Scanner(new java.io.File("g:/a/1.txt"))
    while (in1.hasNext()) {
        val words = in1.next().split("\\s+")
        for (word <- words) {
            m4 += (word -> (m4.getOrElse(word, 0) + 1))
        }
    }
    in1.close()

3.使用已排序的map实现单词统计

    var m5 = SortedMap[String, Int]()
    val source = Source.fromFile("g:/a/1.txt")
    val contents = source.mkString
    val words = contents.split("\\s+")
    for (word <- words) {
        m5(word) = m5.getOrElse(word, 0) + 1
    }
    source.close()

4.按照插入顺序来输出

    var m6 = LinkedHashMap[String, Int]()
    val source1 = Source.fromFile("g:/a/1.txt")
    val arr = source1.getLines().toArray
    for (a <- arr) {
        for (w <- a.split("\\s+"))
            m6(w) = m6.getOrElse(w, 0) + 1
    }
    source1.close

最后输出结果:

    println("m3 : "+m3)
    println("m4 : "+m4)
    println("m5 : "+m5)
    println("m6 : "+m6)

m3 : Map(spark -> 4, hadoop -> 3, sqoop -> 2, hadoop -> 1, 文字 -> 3, 会乱码 -> 3, zookeeper -> 2, hive -> 4, flume -> 2, 会不 -> 3, hbase -> 4)
m4 : Map(sqoop -> 2, 会不 -> 3, hadoop -> 3, spark -> 4, hive -> 4, 会乱码 -> 3, zookeeper -> 2, flume -> 2, 文字 -> 3, hbase -> 4, hadoop -> 1)
m5 : TreeMap(flume -> 2, hadoop -> 3, hbase -> 4, hive -> 4, spark -> 4, sqoop -> 2, zookeeper -> 2, 会不 -> 3, 会乱码 -> 3, 文字 -> 3, hadoop -> 1)
m6 : Map(hadoop -> 1, hadoop -> 3, spark -> 4, hbase -> 4, hive -> 4, zookeeper -> 2, flume -> 2, sqoop -> 2, 文字 -> 3, 会不 -> 3, 会乱码 -> 3)

以下是基于Spark API使用Scala实现词频统计的示例代码,该代码与引用中的步骤和示例类似,实现了从文件读取文本数据,统计其中每个单词出现的频率,并将结果输出到控制台: ```scala package com.sanqian.scala import org.apache.spark.{SparkConf, SparkContext} object WordCountScala { def main(args: Array[String]): Unit = { // 第一步:创建SparkContext val conf = new SparkConf() conf.setAppName("WordCountScala") // .setMaster("local") val sc = new SparkContext(conf) // 第二步:加载数据 var path = "D:\\data\\wordcount.txt" if (args.length == 1) { path = args(0) } val linesRDD = sc.textFile(path) // 第三步:对数据进行切割,把一行数据切分成一个一个单词 val wordsRDD = linesRDD.flatMap(_.split(" ")) // 第四步: 迭代words,将每个word转化为(word, 1)这种形式 val pairsRDD = wordsRDD.map((_, 1)) // 第五步:根据key(其实就是word)进行分组聚合统计 val wordCountRDD = pairsRDD.reduceByKey(_ + _) // 第六步: 将结果打印到控制台 wordCountRDD.foreach(wordCount => println(wordCount._1 + "---" + wordCount._2)) // 第七步:停止SparkContext sc.stop() } } ``` 上述代码首先创建了`SparkContext`对象,用于连接到Spark集群。接着从指定路径读取文本文件,将每行文本拆分成单词,再将每个单词映射为`(单词, 1)`的键值对,然后使用`reduceByKey`函数对相同单词的计数进行累加,最后将统计结果打印到控制台并停止`SparkContext` [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值