Spark SQL编程案例1_单词计数
下面这个示例中,我们使用DataFrame和SQL两种方式来实现单词计数功能。
【例】使用Spark Dataset API统计某个英文文本中的词频。
实现过程和代码如下所示。
1)准备数据文件。请自行创建一个纯文本文件words.txt,并编辑内容如下:
good good study day day up to be or not to be this is a question
2)方法一:使用DSL API实现单词计数。
def main(args: Array[String]): Unit = {
// 0) 创建SparkSession的实例
val spark = SparkSession.builder()
.master("local[*]")
.appName("Spark Basic Example")
.getOrCreate()
// 定义文件路径
val filePath = "src/main/resources/words.txt"
val wordDS = spark.read.textFile(filePath)
// wordDS.printSchema()
// wordDS.show()
// implicit object提供了隐式转换,用于将Scala对象(包括rdd)转换为Dataset、DataFrame、Columns
// implicit object是在SparkSession内部定义的
// implicit object继承了SQLImplicits抽象类
import spark.implicits._
// 对Dataset进行一系列处理,产生一个包含最终结果的Dataset
val wordDF = wordDS
.flatMap(_.split("\\s+"))
.filter(_.size>0)
.groupByKey(_.toLowerCase)
.count
.toDF("word","count")
wordDF.show()
// 获得前3个出现频率最高的词
val top3 = wordDF.orderBy($"count".desc).limit(3)
// 输出结果
top3.show()
}
执行以上代码,输出结果如下所示:
+--------+-----+ | word|count| +--------+-----+ | day| 2| | not| 1| | study| 1| | be| 2| | is| 1| | up| 1| |question| 1| | good| 2| | a| 1| | this| 1| | or| 1| | to| 2| +--------+-----+ +----+-----+ |word|count| +----+-----+ | be| 2| | to| 2| |good| 2| +----+-----+
3)方法二:使用SQL语句
def main(args: Array[String]): Unit = {
// 0) 创建SparkSession的实例
val spark = SparkSession.builder()
.master("local[*]")
.appName("Spark Basic Example")
.getOrCreate()
// 读取输入文件
val filePath = "src/main/resources/words.txt"
val wordDS2 = spark.read.textFile(filePath)
import spark.implicits._
// 转换操作,然后返回加了列标题的DataFrame
val wordDF2 = wordDS2
.flatMap(_.split("\\s+"))
.filter(_.size>0)
.toDF("word")
// 注册为临时view
wordDF2.createOrReplaceTempView("wc_tb")
// 执行SQL查询,分析产生结果
val sql = """
select word,count(1) as count
from wc_tb
group by word
order by count desc
"""
val resultDF = spark.sql(sql)
resultDF.show()
}
执行以上代码,输出结果如下所示:
+--------+-----+ | word|count| +--------+-----+ | good| 2| | be| 2| | day| 2| | to| 2| | is| 1| | not| 1| | up| 1| | study| 1| |question| 1| | this| 1| | a| 1| | or| 1| +--------+-----+