Spark-SparkSQL介绍

2020-07-06  本文已影响0人  布莱安托

SparkSQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrameDataSet,并且作为分布式SQL查询引擎使用。

不同于Hive将HiveQL转换成MapReduce然后提交执行,SparkSQL是将SQL语句转换成RDD然后提交集群执行,执行效率大大提升。

SQL的特点

  1. 易整合
  2. 统一的数据访问方式
  3. 兼容Hive
  4. 标准的数据连接

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要高,主要原因是:

image.png

例如:

users.join(events, users("id") === events("user_id")).filter(events("date") > "2019-12-01")

执行计划为:

image.png image.png image.png

例子中展示了一个对用户事件分析的操作。两个DataFrame进行join后进行filter过滤,如果按照逻辑计划的话会先进行join,再进行filter,而join涉及到了executor间的网络传输,是一个开销比较大的操作。

而SparkSQL优化器则将filter操作下推,先对DataFrame进行过滤,在进行join,这样就避免了不必要的数据的传输,提高了性能。

DataSet

  1. 是DataFrame API的一个扩展。
  2. 用户友好的API风格,既具有类型安全检查也具有DataFrame的查询优化特性。
  3. DataSet支持编解码器,当需要访问非堆上数据是可以避免反序列化整个对象,提高了效率。
  4. case class可以用来在DataSet中定义数据的结构信息,类中的每个属性名称直接映射到DataSet中的字段名称。
  5. DataFrame是DataSet的特例,DataFrame=DataSet[Row],所以通过as方法可以将DataFrame转换为DataSet。而Row是一个类型,用来定义结构化的一行数据。
  6. DataSet是强类型的。
上一篇 下一篇

猜你喜欢

热点阅读