当前位置:   article > 正文

Spark SQL 的SQL处理引擎分析_sparl sql的临时表处理使用的引擎

sparl sql的临时表处理使用的引擎

目录

 

一.补充以Sql Server 为例,SQL语句的执行逻辑顺序

1、From阶段

2、Where 阶段

3、Group By

4、Having

5、Select

6、Order By

7、SQL 流程示意图

二:Sqlparser:sql –> unresolved logical plan

三:Analyzer:Unresolved logical plan –> analyzed logical plan

四:Optimizer: analyzed logical plan –> optimized logical plan

五:Spark Planner:optimized logical plan –> spark plan


一.补充以Sql Server 为例,SQL语句的执行逻辑顺序


https://blog.csdn.net/johnf_nash/article/details/78887618 --参照

1、From阶段

From阶段主要是标识数据来源,处理表运算符(join、apply,pivot等,本文只针对join讲解),以及各个子阶段(包括笛卡尔积、ON筛选器应用、添加外部行[只有外链接才有]);

1.1 join阶段   join分为cross join、inner join、[left join、right join,full join]

                   cross join只是简单的进行笛卡尔积,如上面的两张表cross join之后的结果如下图(左一);

                   inner join是在cross join的基础上加入了ON筛选条件,如图(左二和左三),只有ON(C.customerId=O.customerId)为Ture的才会返回

                   left join 是在 inner join的基础上添加了外部行,在ON阶段获取的数据基础上添加左表(Customer表)中的未满足ON筛选条件的所有行(未在ON阶段出现的),如图(左四)

2、Where 阶段

     where 阶段就是对From阶段得到的虚拟表进行进一步的过滤和筛选,和Join中的ON筛选类似,只是比ON筛选器执行的晚,特别对于外链接来说,ON筛选和Where筛选中间还多了一步添加外部行,这里应该可以解释本文开篇提到的第一个问题了。

3、Group By

     Group By 只是按照指定的列名对第二步(如果存在)Where阶段得到的虚拟表进行分组,每个分组只有一条数据,一般都是使用聚合函数来计算一些数据,比如上面例子中用按照CustomerId进行分组,用Count获取每个客户的订单数量,然后按照订单数量倒序去排名前三的客户。

4、Having

     Having阶段是在第三步(如果存在)分组之后再一次进行过滤,也就是对Group By阶段得到的虚拟结果集进行进一步的筛选过滤,过程和ON、Where类似,只能用在Group BY 之后。

5、Select

     Select 阶段则是针对第四步(如果存在)获取的虚拟表的基础上选择需要的列,也就是最终要返回的列,看到这里是不是明白了本文开篇提到的第二个问题,为什么Select中的别名不能再Wher阶段使用,因为Where早于Select,

Select又可以分为几个子阶段,包括(5.1计算表达式,5.2 Distinct,5.3 Top)

6、Order By

     Order By 阶段是整个查询的最后阶段也就是根据指定的列名对Select阶段进行排序,这也就是为什么在Order By语句中可以用Select阶段起的别名的原因,不过Order By阶段和上面的5个阶段有个很大的区别,Order By阶段返回的数据集是游标,而上面的5个阶段生成的都是数据表,理解这点很重要,SqlServer的理论基础是集合论,集合中的行之间没有预先定义顺序,它只是成员之间的逻辑组合,成员之间的顺序无关紧要,而对于带有Order By的查询语句,是返回了一个按照特定的顺寻组成的一个对象,成为游标。
     

7、SQL 流程示意图


二:Sqlparser:sql –> unresolved logical plan

new lexical.Scanner(input) ==》 
用 lexical.Scanner,进行语法检查,分析。
如果满足,则使用SQL解析器针对SQL进行解析:包括词法解析(将SQL语句解析成一个个的短语,token)、语法解析
最后生成一个Unreasolved LogicalPlan 语法树

语法树:指的命令集,存在着命令的先后顺序,或者同时执行的含义实例:(判断顺序可以参照第0条中的SQL执行顺序)

  1. SELECT id,dev_chnid,dev_chnname,car_num,car_speed,car_direct fromtest where id > 1 group by dev_chnid sort by car_num
  2. unresolvedlogical plan为:
  3. ['Sort
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/776481
推荐阅读
相关标签
  

闽ICP备14008679号