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

教程目录

  • 0x00 教程内容
  • 0x01 数据准备
          • 1. 数据获取
          • 2. 数据内容
  • 0x02 代码实现
          • 1. 启动spark-shell
          • 2. 测试代码
  • 0x03 校验结果
          • 1. 查看是否有统计结果
  • 0xFF 总结

0x00 教程内容

  1. 数据准备
  2. 代码实现
  3. 校验结果
  • 案例背景:这是某年“高校云计算应用创新大赛”的一道题目。
  • 学习内容:主要进行 RDD 的相关操作,包括转换算子和动作算子。
  • 案例目的:统计莎士比亚诗文集中出现频次最高的100个单词,但是这100个单词中不包括停词表中那些没有实际意义的词。
  • 案例思路:将莎士比亚诗文集文件夹下面的多个文件都读成 RDD,然后过滤掉停词表中的单词,统计频次最高的100个单词,并且保存结果在特定的文件夹即可。思路与Spark的WordCount案例相似,文章参考:IntelliJ IDEA开发Spark案例之WordCount,只是难度稍微加大了一点点而已。
  • 案例关键:
    1、读取多个文件生成 RDD
    2、过滤掉某个文件中的单词,所以这些词也应该以某种方式存在
    3、频次最高的100个单词,所以需要排序

0x01 数据准备

1. 数据获取

方式一:
链接地址:邵奈一的学习库 的datas文件夹里查找
具体下载链接:点击下载

方式二:
关注公众号/微信获取:邵奈一公众号、邵奈一WeChat

2. 数据内容

莎士比亚诗文集:Spark综合小案例之莎士比亚诗文集词频统计_第1张图片

存放的路径:Spark综合小案例之莎士比亚诗文集词频统计_第2张图片
使用下面命令解压压缩包:
unzip shakespear.zip

提醒:如果报错=> -bash: unzip: command not found
则需要安装一下zip和unzip后再解压:
yum install -y unzip zip

截图:
Spark综合小案例之莎士比亚诗文集词频统计_第3张图片
查看诗文集内容,注意到其实有一些行是空行来的:
Spark综合小案例之莎士比亚诗文集词频统计_第4张图片

停词表:
Spark综合小案例之莎士比亚诗文集词频统计_第5张图片

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. 查看是否有统计结果

Spark综合小案例之莎士比亚诗文集词频统计_第6张图片

  • 查看未排序前的结果:
    cat /tmp/v4output/*
    Spark综合小案例之莎士比亚诗文集词频统计_第7张图片
    Spark综合小案例之莎士比亚诗文集词频统计_第8张图片

  • 查看排序后的结果:
    cat /tmp/result/*
    Spark综合小案例之莎士比亚诗文集词频统计_第9张图片
    发现均可查看到统计结果!

0xFF 总结

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

作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |

福利:
邵奈一的技术博客导航

邵奈一原创不易,如转载请标明出处,教育是一生的事业。


你可能感兴趣的:(spark,大数据,复制粘贴玩大数据系列教程,spark)