Spark基础(四)SparkSQL
SparkSQL简介
是Spark中针对处理结构化数据的模块。与hive类似。通过sql语句方式对结构化数据进行分析。
RDD,DataFrame,DataSet
DataFrame,DataSet是操作sparkSql的抽象
SparkCore的数据抽象 是RDD的格式。
SparkSQL的抽象是dataframe,dataset。
Dataframe
一个抽象的数据表结构,与hive类似,支持嵌套类型数据(struct,array和map).DataFrame提供了schema的定义,定义了DataFrame中数据的字段个数,以及字段的类型(需要在解析之后才能知道对应的数据类型)。在编译期DataFrame的实际类型为Row。
DataFrame也是存在在堆内存之中的,与RDD不同的是:
- dataframe采用定制化内存管理
- 数据以二进制的方式存在于非堆内存,节省了大量空间之外,还摆脱了GC的限制。
Dataframe的劣势在于在编译期缺少类型安全检查,导致运行时出错。
Dataset
DataFrame可以称之为Dataset[Row],每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知。
而DataSet是Dataframe API的一个扩展,是Spark最新的数据抽象。提供用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。
相对于DataFrame,DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person]
DataFrame的创建
在Spark2.0之后,可以直接通过sparksession创建文件。还可以通过spark将文件读取成为类并创建成DataFrame。
DataSet的创建
SparkSQL的分析函数
"常用分析函数:(最常用的应该是1.2.3 的排序)\n" +
" 1、row_number() over(partition by ... order by ...)\n" +
" 2、rank() over(partition by ... order by ...)\n" +
" 3、dense_rank() over(partition by ... order by ...)\n" +
" 4、count() over(partition by ... order by ...)\n" +
" 5、max() over(partition by ... order by ...)\n" +
" 6、min() over(partition by ... order by ...)\n" +
" 7、sum() over(partition by ... order by ...)\n" +
" 8、avg() over(partition by ... order by ...)\n" +
" 9、first_value() over(partition by ... order by ...)\n" +
" 10、last_value() over(partition by ... order by ...)\n" +
" 11、lag() over(partition by ... order by ...)\n" +
" 12、lead() over(partition by ... order by ...)\n" +
sparkSQL自定义函数
类似于hive当中的自定义函数,我们在spark当中,如果内置函数不够我们使用,我们同样可以使用自定义函数来实现我们的功能,spark当中的自定义函数,同样的也有
-
UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等
-
UDAF(User- Defined Aggregation Funcation),用户自定义聚合函数,类似在group by之后使用的sum,avg等
-
UDTF(User-Defined Table-Generating Functions) , 用户自定义生成函数,有点像stream里面的flatMap