目录
一:sparkSQL介绍
sparkSQL不但兼容hive,还可以从rdd,parquet文件,json文件中获取数据。
二:DataFrame
- dataframe是一种以rdd为基础的分布式数据集,类似于传统数据库中的二维表格。dataframe与rdd的主要区别在于,dataframe带有schema元信息,即dataframe所表示的二维表数据集的每一列都带有名称和类型。
- dataframe也支持嵌套数据类型(struct, array, map)。
- dataframe提供一个特定领域语言(domain-specific language, dsl)去管理结构化的数据。
val df = spark.read.json("data/user.json")
df.printSchema
df.filter($"age" > 30).show
三:dataSet
dataset是分布式数据集合,是dataframe的一个扩展。dataset是强类型的,比如可以有dataset[car], dataset[person]。dataframe是dataset的特例,datasetframe = dataset[row].
1)使用样例类序列创建dataset
case class person(name:string, age:long)
defined class person
val caseclassds = seq(person("zhangsan",2)).toDS()
caseclassDS.show
四:rdd,dataframe,dataset之间的转换
1) dataframe转换为dataset
val ds = df.as[user]
2) dataset转换为 dataframe
val df = ds.toDF
3) dataset转换为rdd
val rdd = ds.rdd
4) rdd转换为dataset
sparksq能够自动将包含有case类的rdd转换为dataset.
5) rdd转换为dataframe
rdd.toDF
6) dataframe转换为rdd
val rdd = df.rdd
五:rdd,dataframe,dataset异同点
5.1 相同点
- 都是spark平台下的分布式弹性数据集。
- 都有惰性机制,在进行创建,转换,如map方法的时候,不会立即执行,只有在遇到action的时候,才会执行。
- 三者都有许多共同的函数,如filter,排序等。
- 三者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心内存会溢出。
- 三者都有partition的概念
- dataset和dataframe均可以使用模式匹配获取各个字段的值和类型。
5.2 区别
1) rdd
- rdd一般和spark millib同时使用
- rdd不支持sparksql
2) dataframe
- dataframe每一行的类型固定为row,每一列的值没法直接访问,只有通过解析才能获取各个字段
- dataframe与dataset均支持sparkSQL的操作
3) dataset
- dataset和dataframe有完全相同的成员函数区别只是每一行的数据类型不同
-
DataFrame也可以叫Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪 些字段,各个字段又是什么类型都无从得知,只能用上面提到的 getAS 方法或者共 性中的第七条提到的模式匹配拿出特定字段。而 Dataset 中,每一行是什么类型是不一定的,在自定义了 case class 之后可以很自由的获得每一行的信息
六:DataFrame的常用操作
- printSchema
打印出DataFrame的模式信息
- select
从DataFrame中选取部分列的数据
- filter
实现条件查询
- groupBy
对记录进行分组
- sort
对记录进行排序