【Spark】莎士比亚文集词频统计

目的

  • 对给定的莎士比亚文集进行词频统计,求前20个出现频率最高的单词和相应的词频
  • 根据停词表排除一些无意义的单词,即停词表中的单词不参与统计

环境

  • IntelliJ IDEA + Maven + Spark_2.1.1
  • Scala_2.11.0

数据

过程

  • 新建工程的详细步骤这里不写,具体请参考这里

  • 具体代码:

import org.apache.spark.{SparkConf, SparkContext}

object WordFrequency  {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("Word Frequency Count")
        .setMaster("local")
        .setSparkHome("/usr/lib/spark/spark-2.1.1-bin-hadoop2.7")
    val sc = new SparkContext(conf)

    val shakespearRDD = sc.textFile("shakespear/*")
    // 读取shakespear文件夹下的所有文件,并创建RDD
    val stopwordRDD = sc.textFile("stopword.txt").map(_.trim).collect()
    // 读取停词表,去除停词表前后的空格,创建RDD

    val shakespear = shakespearRDD
      .flatMap(_.replaceAll("[^\\w]+", " ").split(" "))  // 将所有非字母和数字的字符都替换成空格,并切分字符串
      .filter(_.equals("")==false)  // 过滤空字符串
      .filter(x => stopwordRDD.contains(x.toLowerCase())==false)  // 过滤停词表中的单词

    val results = shakespear
      .map((_,1))   // 每个单词x都映射成元组(x, 1),表示x出现了1次
      .reduceByKey(_+_)  // 按照key(即单词)来求和,即统计每个不同的单词出现的次数
      .map(x=>(x._2, x._1)) // 替换单词和词频的位置
      .sortByKey(false)  // 按照词频排序,false表示从大到小排序
      .map(x=>(x._2, x._1)) // 换回单词和词频的位置

    val resultsTop20 = sc.parallelize(results.take(20))  // 获得前20的单词
    resultsTop20.collect().foreach(println);  //输出
  }
}

  • 输出结果
(him,5410)     //说明him出现了5410次
(thou,4949)
(so,4329)
(thy,3877)
(all,3710)
(thee,3372)
(by,3225)
(we,2923)
(what,2676)
(O,2428)
(good,2413)
(What,2337)
(love,2223)
(lord,2213)
(more,2203)
(now,2175)
(they,2152)
(them,2088)
(man,2046)
(Enter,1978)
  • 成功啦( ̄︶ ̄)
参考

http://blog.csdn.net/taoyanqi8932/article/details/53264140

    原文作者:quit3e
    原文地址: https://www.jianshu.com/p/e2387e92bdcb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞