Spark SQL

目录

Spark SQL产生背景

Spark SQL的特点

SparkSession

DataFrames

Spark SQL的执行计划

RDD、DataFrame和DataSet


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

Spark SQL产生背景

Hive将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所以Spark SQL应运而生,它将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!同时Spark SQL也支持从Hive中读取数据。

Spark SQL的特点

1.容易整合(集成)

Spark SQL允许SQL或DataFrame API在Spark中查询结构化数据。可用于Java、Scala、Python和R。

2、统一的数据访问方式

以相同方式连接到任意数据源,DataFrame和SQL提供了访问各种数据源的常用方法,包括Hive、Avro、Parquet、ORC、JSON和JDBC,甚至可以跨这些数据源加入数据。

3、兼容Hive

在现有仓库上运行SQL和Hive。Spark SQL支持HiveQL语法以及Hive SerDes和UDF,允许访问现有的HIve仓库。

4、标准的数据连接

通过JDBC和ODBC连接。服务器模式为商业智能工具提供行业标准JDBC和ODBC连接。

SparkSession

SparkSession是Spark 2.0引入的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。

早期版本中,SparkContext是spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的context。 

注:对于Streming,我们需要使用StreamingContext;对于sql,使用sqlContext;对于Hive,使用hiveContext。

随着DataSet和DataFrame的API逐渐成为标准的API。spark2.0中,引入SparkSession作为DataSet和DataFrame API的切入点,封装了SparkConf、SparkContext和SQLContext。为了向后兼容,SQLContext和HiveContext也被保存下来。 SparkSession内部封装了sparkContext,计算实际上还是由sparkContext完成的。

特点:

1、为用户提供一个统一的切入点使用Spark 各项功能;

2、允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写程序;

3、减少了用户需要了解的一些概念,可以很容易的与 Spark 进行交互;

4、与 Spark 交互之时不需再创建 SparkConf, SparkContext 以及 SQlContext,这些对象已经封闭在 SparkSession中。

DataFrames

在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。DataFrame与RDD的主要区别在于,前者带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。

Spark SQL可洞察更多的结构信息,优化数据源以及作用于DataFrame之上的变换,达到大幅提升运行时效率的目标。

RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。

注:Dataset 是在 spark1.6 引入的,目的是提供像 RDD 一样的强类型、使用强大的 lambda 函数,同时使用 Spark SQL 的优化执行引擎。到 spark2.0 以后,DataFrame 变成类型为 Row 的 Dataset,即为:type DataFrame = Dataset[Row]

可以用下面一张图详细对比 Dataset/dataframe 和 RDD 的区别:

Spark SQL的执行计划

注:Spark SQL 在 Hive 兼容层面仅依赖 HQL parser、Hive Metastore 和 Hive SerDe。从 HQL 被解析成抽象语法树(AST)起,就全部由 Spark SQL 接管。执行计划生成和优化都由 Catalyst 负责。借助 Scala 的模式匹配等函数式语言特性,利用 Catalyst 开发执行计划优化策略比 Hive 要简洁得多。

总体执行流程如下:从提供的输入API(SQL,Dataset, dataframe)开始,依次经过unresolved逻辑计划,解析的逻辑计划,优化的逻辑计划,物理计划,然后根据cost based优化,选取一条物理计划进行执行。从unresolved logical plan开始, sql的查询是通过抽象语法树(AST)来表示的,所以以后各个操作都是对AST进行的等价转换操作。 针对以上过程作如下几点说明:

1,编程接口:通过像df.groupBy("age")这样的Dataset接口构造查询过程,抽象语法树(AST)会自动建立。而通过“SELECT name, count(age) FROM people where age > 21 group by name” 这样的sql语句进行查询时,需要增加一个步骤是,需要将SQL解析成AST(spark 2.2中目前是借助于antlr4来做)。

2,经过步骤1后,我们可以得到unresolved logical plan,此时像以上sql中的name,count(age),people都是unresolved attribute,relation等,他们是AST树TreeNode的一种类型,但是他们是不能被计算的(实现了Unevaluable接口)。

3,unresolved logical plan通过Analyzer模块定义的一系列规则,将步骤2中的unresolved的attribute,relation借助catalog去解析,如将之前提到的unresolved attribute转换成resolved attribute。此时,如果sql中某个表不存在或者列和表不对应,在此阶段便可以发现。

4,解析成resolved logical plan以后,通过一系列优化规则会将resolved logical plan的AST转化成optimized logical plan的AST。这些优化包括基于规则和代价的优化,比如谓词下推,列值裁剪等。

5,AST到了optimized logical plan以后,利用如下的策略将逻辑计划转化成物理计划,物理计划是可以执行的计划。当有相关的action操作时,物理计划便可以执行。

RDD、DataFrame和DataSet

Spark RDD

RDD代表弹性分布式数据集。它是记录的只读分区集合。 RDD是Spark的基本数据结构。它允许程序员以容错方式在大型集群上执行内存计算。

Spark Dataframe

数据组以列的形式组织起来,类似于关系数据库中的表。它是一个不可变的分布式数据集合。 Spark中的DataFrame允许开发人员将数据结构(类型)加到分布式数据集合上,从而实现更高级别的抽象。

Spark Dataset

Dataset是DataFrame API的扩展,它提供了类型安全(type-safe),面向对象(object-oriented)的编程接口。 Dataset利用Catalyst optimizer可以让用户通过类似于sql的表达式对数据进行查询

RDD和DataSet

DataSet以Catalyst逻辑执行计划表示,并且数据以编码的二进制形式被存储,不需要反序列化就可以执行sorting、shuffle等操作。

DataSet创立需要一个显式的Encoder,把对象序列化为二进制,可以把对象的scheme映射为Spark SQl类型,然而RDD依赖于运行时反射机制。

注:DataSet的性能比RDD的要好很多

DataFrame和DataSet

Dataset可以认为是DataFrame的一个特例,主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row。因此具有如下三个特点:

  1. DataSet可以在编译时检查类型
  2. 并且是面向对象的编程接口。
  3. 后面版本DataFrame会继承DataSet,DataFrame是面向Spark SQL的接口。

注:DataFrame和DataSet可以相互转化,df.as[ElementType]这样可以把DataFrame转化为DataSet,ds.toDF()这样可以把DataSet转化为DataFrame。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值