SparkSQL
SparkSQL
是什么
-
SparkSQL是Spark的一个模块,专门用于处理结构化数据(类似关系表)
-
特点
-
兼容SparkCore
SparkSQL允许在一个Spark程序中同时混合使用高级算子API和SQLAPI -
统一的数据输入输出方式
SparkSQL内置了各种常见数据源的输入输出方式
可以使用如下语法,进行数据输入输出
spark.read.format("fileFormat").load(path)
df.write.format("fileFormat).save(path)
- Spark默认支持的数据格式有:
- 文本格式: JSON CSV TEXT
- 列式存储文件: ORC Parquet
- JDBC: MySQL Oracle...
-
完全兼容Hive
SparkSQL基于Hive内核,提供了与Hive不同的新的数据抽象DataFrame和Dataset
SparkSQL完全兼容Hive中的所有HQL语法和HQL的函数库,UDF
SparkSQL完全支持Hive中的高性能数据结构的序列化和反序列化例如ORC -
提供标准连接
与hiveserver2类似的,SparkSQL也支持启动JDBC服务器,允许远程连接提交SQL
与Hive不同的是,SparkSQL也支持ODBC
-
数据抽象对比
-
Spark1.0 提供了RDD
-
Spark1.3 提供了DataFrame (在1.6之后DataFrame使用Dataset[Row]代替)
-
Spark1.6 提供了Dataset
-
相同点:
RDD、DF、DS都是弹性分布式数据集- 支持多个分区
- 支持依赖关系记录(血统)
- 支持自定义分区器,可以按照某些字段作为Key将数据散列到不同的分区
- 懒执行
RDD的transformation不会真正启动job任务,而是仅仅编译时期记录RDD的依赖关系
DF、DS 创建临时视图
SparkSession.sql("xxx from df、ds") => df、ds
DF、DS在编译SQL时与RDD类似,仅记录依赖关系,执行输出操作时,才真正提交job
-
区别:
-
RDD
使用算子api进行函数操作 -
DataFrame
允许将数据映射为表结构,直接在DF执行SQL
DF中相比较RDD除了保存数据内容,还使用schema保存了数据的字段名和字段类型信息
DF为了构建不同结构的表,内部使用Array[Any]保存每行的数据内容
所以DF是一个弱类型的数据结构,会导致编译时期正常运行时期出现类型转换异常 -
Dataset
具备RDD与DataFrame的所有功能
并且将表结构使用案例类进行映射,保证了编译时期和运行时期的类型安全
DS的弊端是,需要为每个表结构都创建一个实体类与之对应,不够灵活
-
SparkSQL与Hive的兼容
- 如果使用SparkSQL处理原有的Hive数仓,可以做如下操作
- 将hive-site.xml文件拷贝到Spark的conf目录中
- 将mysql的java驱动jar包拷贝到Spark的jars目录中