SparkSQL(源码阅读三)

  额,没忍住,想彻底了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,因此今天再多看点好了~sql

  曾几什么时候,有一个叫作shark的东西,它改了hive的源码。。。忽然有一天,spark Sql忽然出现,以下图:数据库

  = =好了,不逗了,言归正传。。。那么一条sql传统数据库会是怎么解析的呢?缓存

  传统数据库的解析过程是按RusultData SourceOperation的次序来解析的。传统数据库先将读入的SQL语句进行解析,分辨出SQL语句中哪些词是关键字(如select,from,where),哪些是表达式,哪些是Projection,哪些是Data Source等等。进一步判断SQL语句是否规范,不规范就报错,规范则按照下一步过程绑定(Bind)。过程绑定是将SQL语句和数据库的数据字典(列,表,视图等)进行绑定,若是相关的ProjectionData Source等都存在,就表示这个SQL语句是能够执行的。在执行过程当中,有时候甚至不须要读取物理表就能够返回结果,好比从新运行刚运行过的SQL语句,直接从数据库的缓冲池中获取返回结果。 在数据库解析的过程当中SQL语句时,将会把SQL语句转化成一个树形结构来进行处理,会造成一个或含有多个节点(TreeNode)的Tree,而后再后续的处理政对该Tree进行一系列的操做。 优化

 

  然而,Spark SQL对SQL语句的处理和关系数据库对SQL语句的解析采用了相似的方法,首先会将SQL语句进行解析,而后造成一个Tree,后续如绑定、优化等处理过程都是对Tree的操做,而操做方法是采用Rule,经过模式匹配,对不一样类型的节点采用不一样的操做。SparkSQL有两个分支,sqlContext和hiveContext。sqlContext如今只支持SQL语法解析器(Catalyst),hiveContext支持SQL语法和HiveContext语法解析器。spa

好了,下来,咱们就从sqlContext开始。3d

  首先,从大神的注释中,对!是注释= =中能够看出有一些基本的操做啊~catalog DDL注册缓存表啊,cache Table啊,Data soreces数据源啊,配置信息啊,DataFrame建立啊。。我勒个去太多了吧。。。那么继续言归正传,真个过程呢,查阅资料:对象

  一、SQL语句通过SqlParser解析成Unresolved LogicalPlan.blog

  二、使用analyzer结合数据字典(catalog)进行绑定,生成Resolved LogicalPlan.get

  三、使用optimizerResolved LogicalPlan进行优化,生成Optimized LogicalPlan.源码

  四、使用SparkPlanLogicalPlan转换成PhysicalPlan.

  五、使用perpareForExecutionPhysicalPlan转换成可执行物理计划.

  六、使用execute()执行可执行物理计划,生成SchemaRDD.

  而后呢,咱一个方法一个方法的看~一开始呢,它建立了catalog对象,new 出来了个SimpleCatalog,这是个啥呢?

  咱们深刻进去会发现,平时咱们用的registerTable注册表、tableExistsgetTables这些都是在这里搞的啊。。。一开始就将表名与LogicalPlan一块儿放入缓存tables = new ConcurrentHashMap[String,LogicalPlan]中去。

  那么它的语法解析,treeNode中,就封装了咱们全部要调用的好比mapflatMapcollect等等等等方法。

  

  再下来。。我就看不懂了。。。第一遍源码表太纠结嘛。。。咱慢慢来。。回到sqlContext,全部的sql入口在这里,观察直接是DataFrame

  

  曾经应该是SchemaRDD的,现现在直接封装为DataFrame(spark1.6).再往下看。。真的看不懂了。。。是语法解析。。。为了坚持下去先读通一遍。。个人天~爽虐爽虐的。。后续补充sql解析。。。太晚了看的头大。。还没写一行代码。。。

  参考文献:《深刻理解Spark核心思想与源码解析》

相关文章
相关标签/搜索