目的
- 对给定的莎士比亚文集进行词频统计,求前20个出现频率最高的单词和相应的词频
- 根据停词表排除一些无意义的单词,即停词表中的单词不参与统计
环境
- IntelliJ IDEA + Maven + Spark_2.1.1
- Scala_2.11.0
数据
- 莎士比亚文集和停词表
- 百度网盘: https://pan.baidu.com/s/1bo1Fr3p
- 密码: 6t43
过程
新建工程的详细步骤这里不写,具体请参考这里
具体代码:
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)
- 成功啦( ̄︶ ̄)