声明:本博客内容由本人经过实验楼实验得来。
题目描述
在给定的莎士比亚文集上(多个文件),根据规定的停词表,统计出现频率最高的 100 个单词。所谓的停词表,即在词表中的词语并不统计他的频率。
莎士比亚文集中具有多个章节,因此需要用到并行化的方法,这里使用Spark
进行处理。
数据下载
# 莎士比亚文集:
wget http://labfile.oss.aliyuncs.com/courses/456/shakespear.zip
# 停词表:
wget http://labfile.oss.aliyuncs.com/courses/456/stopword.txt
编程模型
Spark上开发的应用程序都是由一个driver programe
构成,这个所谓的驱动程序在Spark集群通过跑main函数来执行各种并行操作。集群上的所有节点进行并行计算需要共同访问一个分区元素的集合,这就是RDD(RDD resilient distributed dataset)
弹性分布式数据集。RDD可以存储在内存或磁盘中,具有一定的容错性,可以在节点宕机重启后恢复。RDD可以从文件系统或HDFS中的文件创建,也可以从Scala或Python集合中创建。
主要针对RDD进行各种操作,程序中的步骤:
提取数据到RDD中,在本实验中我们将莎士比亚文集和停词表文件转换成RDD
1. 转换(transformations)操作:将已存在的数据集转换成新的数据集,例如map。转换是惰性的,不会立刻计算结果,仅仅记录转换操作应用的目标数据集,当动作需要一个结果时才计算。在本实验中我们需要转换文集RDD和停词表RDD。
2. 动作(actions) :数据集计算后返回一个值给驱动程序,例如reduce。本实验中需要对统计词频map的结果进行reduce操作。
程序实现
读入文件:
# 打开pyspark
[yqtao@localhost ~]$ pyspark
# 读入数据
>>> inputFiles = "/home/yqtao/bigdata/shakespear/*"
>>> stopWordFile = "/home/yqtao/bigdata/stopword.txt"
# 创建RDD文件
>>> inputRDD = sc.textFile(inputFiles)
>>> stopRDD = sc.textFile(stopWordFile)
处理特殊符号
输入的文件内容里除了英文单词之外,还有下面的特殊符号,这些符号不应该计算到统计中。
- 制表符
- 反斜线
- 句号
- 逗号
- 竖线 |
- 中括号