SparkSQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame
和DataSet
,并且作为分布式SQL查询引擎使用。
不同于Hive将HiveQL转换成MapReduce然后提交执行,SparkSQL是将SQL语句转换成RDD然后提交集群执行,执行效率大大提升。
SQL的特点
- 易整合
- 统一的数据访问方式
- 兼容Hive
- 标准的数据连接
DataFrame
与RDD类似,DataFrame也是一个分布式数据容器。但是DataFrame更像传统数据库的二维表格,除了数据之外还记录数据的结构信息,即schema。
同时,与Hive类似,DataFrame也支持嵌套数据类型(struct,array和map)。
从API易用性的角度看DataFrame API提供的是一套高层的关系操作,比RDD API要更加友好。
对于RDD来说,它只关心是什么类型的数据:
Person |
---|
Person |
Person |
Person |
而对于DataFrame,它呈现了数据的每一列的名字以及数据类型:
Name | Age |
---|---|
String | Int |
String | Int |
DataFrame为数据提供了Schema的视图,可以把它当做是数据库中的一张表,DataFrame也是懒执行的,但是性能要比RDD要高,主要原因是:
- 优化的执行计划:查询计划通过Spark Catalyst Optimiser进行优化
例如:
users.join(events, users("id") === events("user_id")).filter(events("date") > "2019-12-01")
执行计划为:
- logical plan
- optimized plan
- optimized plan with intelligent data sources
例子中展示了一个对用户事件分析的操作。两个DataFrame进行join后进行filter过滤,如果按照逻辑计划的话会先进行join,再进行filter,而join涉及到了executor间的网络传输,是一个开销比较大的操作。
而SparkSQL优化器则将filter操作下推,先对DataFrame进行过滤,在进行join,这样就避免了不必要的数据的传输,提高了性能。
DataSet
- 是DataFrame API的一个扩展。
- 用户友好的API风格,既具有类型安全检查也具有DataFrame的查询优化特性。
- DataSet支持编解码器,当需要访问非堆上数据是可以避免反序列化整个对象,提高了效率。
- case class可以用来在DataSet中定义数据的结构信息,类中的每个属性名称直接映射到DataSet中的字段名称。
- DataFrame是DataSet的特例,
DataFrame=DataSet[Row]
,所以通过as
方法可以将DataFrame转换为DataSet。而Row是一个类型,用来定义结构化的一行数据。 - DataSet是强类型的。
网友评论