SparkSQL的解析详解

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

  首先说下传统数据库的解析,传统数据库的解析过程是按Rusult、Data Source、Operation的次序来解析的。传统数据库先将读入的SQL语句进行解析,分辨出SQL语句中哪些词是关键字(如select,from,where),哪些是表达式,哪些是Projection,哪些是Data Source等等。进一步判断SQL语句是否规范,不规范就报错,规范则按照下一步过程绑定(Bind)。过程绑定是将SQL语句和数据库的数据字典(列,表,视图等)进行绑定,如果相关的Projection、Data 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的解析过程:

  (1)SQL语句经过SqlParse解析成Unresolved LogicalPlan。

  (2)使用analyzer结合数据字典(cataqlog)进行绑定,生成resolved LogicalPlan。

  (3)使用optimizer对resolved LogicalPlan进行优化,生成optimized LogicalPlan。

  (4)使用SparkPlan将LogicalPlan转换成PhysicalPlan。

  (5)使用prepareForExecution()将PhysicalPlan转换成可执行物理计划。

  (6)使用execute()执行物理计划。

  (7)生成SchemaRDD。

  然而并没有什么卵用,catalyst解析做的有些简陋,很多不支持,所以在写程序的时候,还是声明的hiveContext对象。

  hiveContext的解析过程:

  (1)SQL语句经过HiveQl.parseSql解析成了Unresolved LogicalPlan。

    (2)使用analyzer结合hive的metastore进行绑定,生成resolved LogicalPlan。

  (3)使用optimizer对resolved LogicalPlan进行优化,生成optimized LogicalPlan。

  (4)使用hivePlanner将LogicalPlan转换成PhysicalPlan。

  (5)shiyong prepareForExecution()将PhysicalPlan转换成可执行物理计划。

  (6)使用execute()执行可执行物理计划。

  (7)执行后,使用map(_.copy)将结果导入SchemaRDD。 (最终转化为RDD)

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏陈本布衣

SQLite 带你入门

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

4065
来自专栏Kevin-ZhangCG

Oracle学习笔记四

在写java程序中有集合的概念,那么在pl/sq中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。

792
来自专栏农夫安全

注入学习之sqli-labs-4(第三关)

前言 说明一下问什么没有less2、less3、less4的讲解? 前两篇如果你弄懂了,第2、3、4关卡原理都是一样的,无非是sql语句的稍微不同 比如: 第一...

3436
来自专栏行者常至

java中的单例模式浅析

Singleton模式主要作用是保证在java应用程序中,一个类class只有一个实例存在。在很多操作中,比如建立目录、数据库连接都需要这样的单线程操作。

681
来自专栏程序员的SOD蜜

使用OQL“语言”构造ORM实体类的复杂查询条件

OQL”语言“ 是PDF.NET数据开发框架的实体对象查询语言,一直以来,ORM的复杂查询条件都是困扰ORM的问题,所以很多时候不得不舍弃ORM,直接手工拼接S...

2016
来自专栏我爱编程

Day24访问数据库

使用SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在i...

3784
来自专栏L宝宝聊IT

T-SQL查询语句

1537
来自专栏python成长之路

(解释文)My SQL中主键为0和主键自排约束的关系

1855
来自专栏有趣的django

Flask构建微电影(二) 第三章、项目分析、搭建目录及模型设计

1640
来自专栏java技术学习之道

JAVA设计模式之单例模式

1443

扫码关注云+社区