0x00 教程内容
数据准备
代码实现
校验结果
案例背景:这是某年“高校云计算应用创新大赛”的一道题目。
学习内容:主要进行 RDD 的相关操作,包括转换算子和动作算子。
案例目的:统计莎士比亚诗文集中出现频次最高的100个单词,但是这100个单词中不包括停词表中那些没有实际意义的词。
案例思路:将莎士比亚诗文集文件夹下面的多个文件都读成 RDD,然后过滤掉停词表中的单词,统计频次最高的100个单词,并且保存结果在特定的文件夹即可。思路与Spark的WordCount案例相似,文章参考:IntelliJ IDEA开发Spark案例之WordCount,只是难度稍微加大了一点点而已。
案例关键:
1、读取多个文件生成 RDD
2、过滤掉某个文件中的单词,所以这些词也应该以某种方式存在
3、频次最高的100个单词,所以需要排序
0x01 数据准备
1. 数据获取
方式一:
链接地址:邵奈一的学习库 的datas文件夹里查找
具体下载链接:点击下载
方式二:
2. 数据内容
莎士比亚诗文集:
存放的路径:
使用下面命令解压压缩包:
unzip shakespear.zip
提醒:如果报错=> -bash: unzip: command not found
则需要安装一下zip和unzip后再解压:
yum install -y unzip zip
截图:
查看诗文集内容,注意到其实有一些行是空行来的:
停词表:
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. 查看是否有统计结果
查看未排序前的结果:
cat /tmp/v4output/*
查看排序后的结果:
cat /tmp/result/*
- 发现均可查看到统计结果!
0xFF 总结
- 本教程较简单,关键有三个点:生成RDD的是多个文件、需要过滤掉一个文件里面的内容、需要对统计结果进行排序。其中会涉及到一些Scala常用方法,如trim、 replace、split等,如果有一定的编程基础,相信一看就能看得懂是什么意思。
- 此外还涉及到一点点的正则表达式,可以自行查阅资料学习,也可以参考本博客教程:JavaScript正则表达式轻松入门
- 更多学习资源请关注公众号、加微信、点赞加关注,感谢!