目录
一、数据帧 - DataFrame
(一)DataFrame概述
(二)将RDD转成DataFrame
二、数据集 - Dataset
(一)Dataset概述
(二)DataFrame与Dataset的关系
三、简单使用Spark SQL
(一)了解SparkSession
(二)准备数据文件
(三)加载数据为Dataset
1、读取文本文件,返回数据集
2、显示数据集的内容
(四)给数据集添加元数据信息
1、定义样例类
2、导入隐式转换
3、将数据集转换成学生数据集
4、查看学生数据集内容
(1)投影操作 -- select
(2)过滤操作 -- filter
(3)统计操作 -- count
(4)排序操作
(五)将数据集转为数据帧
1、将数据集转为数据帧
2、对数据帧进行各种操作
(1)显示数据帧内容
(2)打印数据帧模式信息
(3)对数据帧进行投影操作
(4)对数据帧进行过滤操作
(5)统计数据帧行数
(6)对数据帧进行分组统计
DataFrame是Spark SQL提供的一个编程抽象,与RDD类似,也是一个分布式的数据集合,但与RDD不同,DataFrame的数据都被组织到有名字的列中,就像关系型数据库中的表一样。此外,多种数据都可以转化为DataFrame,例如Spark计算过程中生成的RDD、结构化数据文件、Hive中的表、外部数据库等。
DataFrame在RDD的基础上添加了数据描述信息(Schema,即元信息),因此看起来更像是一张数据库表。
使用DataFrame API结合SQL处理结构化数据比RDD更加容易,而且通过DataFrame API或SQL处理数据,Spark优化器会自动对其优化,即使写的程序或SQL不高效,也可以运行得很快。
Dataset是一个分布式数据集,是Spark 1.6中添加的一个新的API。相对于RDD,Dataset提供了强类型支持,在RDD的每行数据加了类型约束。而且使用Dataset API同样会经过Spark SQL优化器的优化,从而提高程序执行效率。
在Spark中,一个DataFrame
所代表的是一个元素类型为Row
的Dataset
,即DataFrame
只是Dataset[Row]
的一个类型别名。
创建student.txt
文件
vim student.txt
注意:文件中不能包含空行,否则后续会报错
1,郑秀芸,女,20
2,王志峰,男,18
3,陈燕文,女,21
4,郑国栋,男,19
5,肖雨涵,男,20
启动Spark Shell:
spark-shell --master spark://master:7077
调用SparkSession对象的read.textFile()
可以读取指定路径中的文件内容,并加载为一个Dataset
val ds = spark.read.textFile("hdfs://master:9000/input/student.txt")
textFile()
方法读取文本内容外,还可以使用csv()
、jdbc()
、json()
等方法读取CSV
文件、JDBC
数据源、JSON
文件等数据。输出Dataset的数据内容
ds.show()
Student
,用于存放数据描述信息(Schema
)case class Student(id: Int, name: String, gender: String, age: Int)
传入相应参数即可创建对象
val student = Student(1,"小明","男",30)
import spark.implicits._
map()
算子将每一个元素拆分并存入Student
样例对象进入粘贴模式
val studentDS = ds.map(line => {
val fields = line.split(",")
val id = fields(0).toInt
val name = fields(1)
val gender = fields(2)
val age = fields(3).toInt
Student(id,name,gender,age)
})
studentDS.show()
studentDS.select("name","age").show()
studentDS.filter("gender == '女'").show()
方法1
方法2
studentDS.filter("gender == '女' and age > 20").show()
val count = studentDS.filter("gender == '女' and age > 20").count()
分组统计男女总年龄
studentDS.groupBy("gender").sum("age").show()
分组统计男女生平均年龄
studentDS.groupBy("gender").avg("age").show()
分组统计男女生最大年龄
studentDS.groupBy("gender").max("age").show()
先按性别为女升序排列,再按年龄降序排列
studentDS.sort(studentDS("gender"),studentDS("age").desc).show()
Spark SQL查询的是DataFrame中的数据,因此需要将存有元数据信息的Dataset转为DataFrame。调用Dataset的toDF()
方法,将存有元数据的Dataset转为DataFrame。
val studentDF = studentDS.toDF()
studentDF.show()
将年龄+1,显示学生姓名和年龄字段
studentDF.select(studentDF("name"), studentDF("age") + 1).show()
查询年龄在19岁以上的记录
studentDF.filter(studentDF("age") > 19).show()
查询年龄在20岁以上的女生记录
studentDF.filter("age > 20 and gender == '女'").show()
统计总记录数
studentDF.count()
分组统计男女生年龄总和
studentDF.groupBy("gender").sum("age").show()