Spark综合小案例之莎士比亚诗文集词频统计

简介: Spark综合小案例之莎士比亚诗文集词频统计

0x00 教程内容


数据准备

代码实现

校验结果

案例背景:这是某年“高校云计算应用创新大赛”的一道题目。

学习内容:主要进行 RDD 的相关操作,包括转换算子和动作算子。

案例目的:统计莎士比亚诗文集中出现频次最高的100个单词,但是这100个单词中不包括停词表中那些没有实际意义的词。

案例思路:将莎士比亚诗文集文件夹下面的多个文件都读成 RDD,然后过滤掉停词表中的单词,统计频次最高的100个单词,并且保存结果在特定的文件夹即可。思路与Spark的WordCount案例相似,文章参考:IntelliJ IDEA开发Spark案例之WordCount,只是难度稍微加大了一点点而已。

案例关键:

1、读取多个文件生成 RDD

2、过滤掉某个文件中的单词,所以这些词也应该以某种方式存在

3、频次最高的100个单词,所以需要排序


0x01 数据准备


1. 数据获取

方式一:

链接地址:邵奈一的学习库 的datas文件夹里查找

具体下载链接:点击下载

方式二:

关注公众号/微信获取:邵奈一公众号邵奈一WeChat

2. 数据内容

莎士比亚诗文集:


微信图片_20220619132504.png


存放的路径:


微信图片_20220619132507.png


使用下面命令解压压缩包:

unzip shakespear.zip

提醒:如果报错=> -bash: unzip: command not found

则需要安装一下zip和unzip后再解压:

yum install -y unzip zip

截图:


image.png


查看诗文集内容,注意到其实有一些行是空行来的:


image.png


停词表:


微信图片_20220619132557.png


0x02 代码实现


1. 启动spark-shell

spark-shell

2. 测试代码


// 引入类
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
// 定义作业名称
val appName = "WordCount"
// 新建SparkConf对象并设置作业名称与设置运行模式
val conf = new SparkConf().setAppName(appName).setMaster("local")
// 定义数据的路径(需根据实际情况修改)
val inputFiles = "/home/hadoop-sny/datas/shakespear/*"
val stopWordFile = "/home/hadoop-sny/datas/stopword.txt"
// 生成莎士比亚诗文集RDD与停词表RDD
val inputRDD = sc.textFile(inputFiles)
val stopRDD = sc.textFile(stopWordFile)
// 定义一个字符串数组(内容为不需要统计的一些标点符号等等)
val targetList: Array[String] = Array[String]("""\t\().,?[]!;|""")
// 如遇到数组中的标点符号,则用空格替换掉(并过滤掉一个活多个空格,回车,换行等空白符)
def replaceAndSplit(s: String): Array[String] = {
    for(c <- targetList)
      s.replace(c, " ")
    s.split("\\s+")
}
// 替换及过滤诗文集操作
val inputRDDv1 = inputRDD.flatMap(replaceAndSplit)
// 去除停词表RDD中每行字符串的首尾空格
val stopList = stopRDD.map(x => x.trim()).collect()
// 过滤掉诗文集中停词表里的词
val inputRDDv2 = inputRDDv1.filter(x => !stopList.contains(x))
// 诗文集map操作
val inputRDDv3 = inputRDDv2.map(x => (x,1))
// 诗文集reduceByKey操作
val inputRDDv4 = inputRDDv3.reduceByKey(_ + _)
// 保存统计结果到指定路径
inputRDDv4.saveAsTextFile("/tmp/v4output")
// 讲统计结果进行key与value位置对换
val inputRDDv5 = inputRDDv4.map(x => x.swap)
// 对换后对key进行降序操作(即单词次数最多的在最前面)
val inputRDDv6 = inputRDDv5.sortByKey(false)
// 重新对换key与value的位置,并取key
val inputRDDv7 = inputRDDv6.map(x => x.swap).keys
// 得到100个出现次数最多的100个词
val top100 = inputRDDv7.take(100)
// 词频次数最多的100个词生成RDD并保存在指定路径
val outputFile = "/tmp/result"
val result = sc.parallelize(top100)
result.saveAsTextFile(outputFile)


注意:代码中的文件路径运行模式需要根据实际情况进行修改。


0x03 校验结果


1. 查看是否有统计结果

image.png


查看未排序前的结果:

cat /tmp/v4output/*


image.png


查看排序后的结果:

cat /tmp/result/*


image.png


  • 发现均可查看到统计结果!


0xFF 总结


  1. 本教程较简单,关键有三个点:生成RDD的是多个文件、需要过滤掉一个文件里面的内容、需要对统计结果进行排序。其中会涉及到一些Scala常用方法,如trim、 replace、split等,如果有一定的编程基础,相信一看就能看得懂是什么意思。
  2. 此外还涉及到一点点的正则表达式,可以自行查阅资料学习,也可以参考本博客教程:JavaScript正则表达式轻松入门
  3. 更多学习资源请关注公众号、加微信、点赞加关注,感谢!


相关文章
|
6月前
|
SQL 分布式计算 数据可视化
Spark SQL案例【电商购买数据分析】
Spark SQL案例【电商购买数据分析】
|
SQL 分布式计算 资源调度
线上 hive on spark 作业执行超时问题排查案例分享
线上 hive on spark 作业执行超时问题排查案例分享
|
6月前
|
分布式计算 大数据 Scala
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
【大数据技术Hadoop+Spark】Spark RDD创建、操作及词频统计、倒排索引实战(超详细 附源码)
291 1
|
1月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
49 5
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
48 3
|
1月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
60 0
|
1月前
|
分布式计算 大数据 Spark
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(二)
大数据-95 Spark 集群 SparkSQL Action与Transformation操作 详细解释与测试案例(二)
39 1
|
1月前
|
设计模式 数据采集 分布式计算
企业spark案例 —出租车轨迹分析
企业spark案例 —出租车轨迹分析
62 0
|
1月前
|
消息中间件 分布式计算 Kafka
大数据-102 Spark Streaming Kafka ReceiveApproach DirectApproach 附带Producer、DStream代码案例
大数据-102 Spark Streaming Kafka ReceiveApproach DirectApproach 附带Producer、DStream代码案例
55 0
|
1月前
|
SQL 分布式计算 大数据
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
大数据-101 Spark Streaming DStream转换 窗口操作状态 跟踪操作 附带多个案例(一)
29 0