sparkSQL的整体实现框架

1, sql语句的模块解析

,,当我们写一个查询语句时,一般包含三个部分,选择部分,从数据源部分,在限制条件部分,这三部分的内容在sql中有专门的名称:

 sparkSQL的整体实现框架

当我们写sql时,如上图所示,在进行逻辑解析时会把sql分成三个部分,项目中,数据源,过滤模块,当生成执行部分时又把他们称为:结果模块,

数据源模块和备件模块。

那么在关系数据库中,当我们写完一个查询语句进行执行时,发生的过程如下图所示:

整个执行流程是:查询→解析→绑定→优化→执行

1,写完sql查询语句,sql的查询引擎首先把我们的查询语句进行解析,也就是解析过程,解析的过程是把我们写的查询语句进行分割,把项目中,数据源和过滤三个部分解析出来从而形成一个逻辑解析树,在解析的过程中还会检查我们的sql语法是否有错误,比如缺少指标字段,数据库中不包含这张数据表等。当发现有错误时立即停止解析,并报错。当顺利完成解析时,会进入到绑定过程。

通过单词我们可看的出,这个过程是一个绑定的过程。为什么需要绑定过程?这个问题需要我们从软件实现的角度去思考,如果让我们来实现这个sql查询引擎,我们应该怎么做?他们采用的策略是首先把sql查询语句分割,分割不同的部分,再进行解析从而形成逻辑解析树,然后需要知道我们需要取数据的数据表在哪里,需要哪些字段,执行什么逻辑,这些都保存在数据库的数据字典中,因此绑定过程,其实就是把解析过程后形成的逻辑解析树,与数据库的数据字典绑定的过程。绑定后会形成一个执行树,从而让程序知道表在哪里,需要什么字段等等

3,完成了绑定过程后,数据库查询引擎会提供几个查询执行计划,并且给出了查询执行计划的一些统计信息,既然提供了几个执行计划,那么有比较就有优劣,数据库会根据这些执行计划的统计信息选择一个最优的执行计划,因此这个过程是优化(优化)过程。

4,选择了一个最优的执行计划,那么就剩下最后一步执行执行,最后执行的过程和我们解析的过程是不一样的,当我们知道执行的顺序,对我们以后写sql以及优化都是有很大的帮助的。执行查询后,他是先执行,部分,然后找到数据源之数据表,最后生成选择的部分,我们的最终结果。执行的顺序是:

虽然以上部分对sparkSQL没有什么联系,但是知道这些,对我们理解sparkSQL还是很有帮助的。

,

2, sparkSQL框架的架构

要想对这个框架有一个清晰的认识,首先我们要弄清楚,我们为什么需要sparkSQL呢?个人建议一般情况下在写sql能够直接解决的问题就不要使用sparkSQL,如果想刻意使用sparkSQL,也不一定能够加快开发的进程。使用sparkSQL是为了解决一般用sql不能解决的复杂逻辑,使用编程语言的优势来解决问题。我们使用sparkSQL一般的流程如下图:

如上图所示,一般情况下分为两个部分:a,把数据读入到sparkSQL中,sparkSQL进行数据处理或者算法实现,然后再把处理后的数据输出到相应的输出源中。

1,同样我们也是从如果让我们开发,我们应该怎么做,需要考虑什么问题来思考这个问题。

,,,,第一个问题是,数据源有几个,我们可能从哪些数据源读取数据?现在sparkSQL支持很多的数据源,比如:蜂巢数据仓库,json文件,。三种,以及兽人文件,同时现在还支持jdbc从关系数据库中取数据。功能很强大。

,,,b,还一个需要思考的问题是数据类型怎么映射啊?我们知道当我们从一个数据库表中读入数据时,我们定义的表结构的字段的类型和编程语言比如scala中的数据类型映射关系是怎样的一种映射关系?在sparkSQL中有一种来解决这个问题的方法,来实现数据表中的字段类型到编程语言数据类型的映射关系。这个以后详细介绍,先了解有这个问题就行。

,,,c,数据有了,那么在sparkSQL中我们应该怎么组织这些数据,需要什么样的数据结构呢,同时我们对这些数据都可以进行什么样的操作? sparkSQL采用的是DataFrame数据结构来组织读入到sparkSQL中的数据,DataFrame数据结构其实和数据库的表结构差不多,数据是按照行来进行存储,同是还有一个模式,就相当于数据库的表结构,记录着每一行数据属于哪个字段。

,,,d,当数据处理完以后,我们需要把数据放入到什么地方,并切以什么样的格式进行对应,这个a和b要解决的问题是相同的。

2, sparkSQL对于以上问题,的实现逻辑也很明确,从上图,已经很清楚,主要分为两个阶段,每个阶段都对应一个具体的类来实现。

sparkSQL的整体实现框架