用spark SQL 实现统计莎士比亚诗文集中出现频次最高的100个单词,但是这100个单词中不包括停词表中那些没有实际意义的词。
时间: 2024-02-11 20:07:05 浏览: 156
大数据技术实践——Spark词频统计
5星 · 资源好评率100%
以下是用Spark SQL实现统计莎士比亚诗文集中出现频次最高的100个单词的代码:
```scala
// 引入类
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
// 定义作业名称
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"
// 生成SparkSession对象
val spark = SparkSession.builder().appName(appName).config(conf).getOrCreate()
// 读取莎士比亚诗文集并创建DataFrame
val inputDF = spark.read.text(inputFiles)
// 定义一个字符串数组(内容为不需要统计的一些标点符号等等)
val targetList: Array[String] = Array[String]("""\t\().,?[]!;|""")
// 定义一个UDF,用于将一行文本拆分为单词
val splitWords = udf((s: String) => {
for(c <- targetList)
s.replace(c, " ")
s.split("\\s+")
})
// 将文本拆分为单词并过滤掉停用词表中的词,然后进行词频统计
val wordCountDF = inputDF
.select(explode(splitWords($"value")).as("word"))
.filter(!$"word".isin(spark.read.text(stopWordFile).as[String]))
.groupBy("word")
.count()
// 获取出现频次最高的100个单词
val top100DF = wordCountDF.orderBy($"count".desc).limit(100)
// 将DataFrame转换为RDD,并保存结果到指定路径
top100DF.rdd.map(row => row.getString(0)).saveAsTextFile("/tmp/sql_output")
// 停止SparkSession
spark.stop()
```
首先,程序创建了一个SparkSession对象,并使用该对象读取了莎士比亚诗文集和停用词表。然后,程序定义了一个UDF(splitWords),用于将一行文本拆分为单词。接着,程序将文本拆分为单词并过滤掉停用词表中的词,然后使用groupBy和count函数进行词频统计。最后,程序使用orderBy和limit函数获取出现频次最高的100个单词,并将结果保存到指定路径。
需要注意的是,使用Spark SQL进行统计时,可以使用许多SQL中的常用操作,如select、filter、groupBy、count、orderBy等,这样可以简化代码并提高开发效率。同时,Spark SQL还支持UDF(User-Defined Functions),可以方便地自定义函数进行数据处理。
阅读全文