SparkSQL(源码阅读三)

  额,没忍住,想完全了解sparksql,毕竟一直在用嘛,想一次性搞清楚它,所以今天再多看点好了~

  曾几何时,有一个叫做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语法解析器。

好了,下来,我们就从sqlContext开始。

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

  1、SQL语句经过SqlParser解析成Unresolved LogicalPlan.

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

  3、使用optimizerResolved LogicalPlan进行优化,生成Optimized LogicalPlan.

  4、使用SparkPlanLogicalPlan转换成PhysicalPlan.

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

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

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

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

  那么它的语法解析,treeNode中,就封装了我们所有要调用的比如mapflatMapcollect等等等等方法。

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王小雷

SAS进阶《深入解析SAS》之Base SAS基础、读取外部数据到SAS数据集

SAS进阶《深入解析SAS》之Base SAS基础、读取外部数据到SAS数据集 前言:在学习完《SAS编程与商业案例》后,虽然能够接手公司的基本工作,但是为了更...

2197
来自专栏个人分享

SparkSQL的解析详解

  SparkSQL继承自Hive的接口,由于hive是基于MapReduce进行计算的,在计算过程中大量的中间数据要落地于磁盘,从而消耗了大量的I/O,降低了...

1422
来自专栏后台架构

Sphinx源码学习笔记(一):索引创建

  因为项目开发需要在游戏内部实现玩家名称的模糊查找功能,本身直接使用Sphinx配置mysql可以直接搭建一套模糊匹配的即可支持功能的实现。

4357
来自专栏恰同学骚年

《T-SQL查询》读书笔记Part 3.索引的基本知识

索引优化是查询优化中最重要的一部分,索引是一种用于排序和搜索的结构,在查找数据时索引可以减少对I/O的需要;当计划中的某些元素需要或是可以利用经过排序的数据时,...

1253
来自专栏Java后端生活

JDBC(三)PreparedStatement

SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的 SQL 语句段或命令,从而利用系统的 SQL 引擎完成恶意行为的做法

781
来自专栏陈本布衣

SQLite 带你入门

SQLite数据库相较于我们常用的Mysql,Oracle而言,实在是轻量得不行(最低只占几百K的内存)。平时开发或生产环境中使用各种类型的数据库,可能都需要...

4135
来自专栏用户画像

mysql模拟题二

  3) MSSQLServer2005Enterprise Edition是哪一种版本?

996
来自专栏更流畅、简洁的软件开发方式

预防SQL注入攻击之我见

1、 SQL注入攻击的本质:让客户端传递过去的字符串变成SQL语句,而且能够被执行。 2、 每个程序员都必须肩负起防止SQL注入攻击的责任。   说起防止SQ...

4776
来自专栏Kevin-ZhangCG

[ SSH框架 ] Hibernate框架学习之三

20811
来自专栏积累沉淀

Mybatis多对多关联查询

mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联...

2269

扫码关注云+社区

领取腾讯云代金券