Catalyst揭秘 Day3

sqlParser解析

今天我们会进入catalyst引擎的第一个模块sqlparser,它是catalyst的前置模块。

树形结构

从昨天的介绍我们可以看到sqlParser会返回一个logicalPlan,它是TreeNode的子类。

TreeNode,作为一个树形抽象类,SQL语法的解析的时候,所有的元素都是TreeNode,可能是叶子节点,也可能是树枝节点,可能有0个或多个子节点,其方法都是对树的操作。

通过SQLParser,会把我们的sql语句变成一颗树,针对这个树,我们有一系列的数据类型,并且运用一系列的规则,对这个树进行解析、优化。所以第一个问题,就是怎么生成这个树,这个就是SQLParser的价值。

解析入口

sqlparse完成的步骤就是怎么把一个sql变成树状结构。

我们进入源码,从sql方法开始,会调用parseSql方法。

其最终是会调用ParserDialect的parse方法。

再进一步,会调用AbstractSparkSQLParser的parse方法来实现,这个方法非常的关键,使用的是个模板模式。

这里面会用到lexical词法解析。

首先我们看到,在构造时,会使用反射的方式来找到所有保留的关键字。

并在词法解析器初始化时,会进行添加。

AbstractSparkSQLParser的parse方法是关键,我们来详细解析一下。
这里有三个关键部分,phrase方法,start方法和Scanner对象。

解析方法1:循环遍历

首先看一下phrase方法,这是一个总控方法,会构造一个解析器,内部这是个循环器,循环读取字符串中的数据,进行解析生成短语。注意下,方法核心就是调用一句p(in),其中p是start方法,而in是Scanner对象。

解析方法2:分词

再看下Scanner对象,其主要作用是对字符串进行分词,其中核心是whitespace和token方法。
Success封装了我们当前的解析结果和没有解析的结果,对分词功能来说,未解析部分是我们需要的。

whitespace中定义了对于分割词的规则。

token中定义了合法字符的校验。

这里的表达是比较复杂,我们简单看一下。

关键字都会被定义为Keyword类型,这里有两个隐式转换。

首先是对Keyword进行转换,会对字符进行格式化normalize。

下面是更关键,会对输入字符进行隐式转换,构建Parser,默认是于输入字符进行==等式判断。

acceptIf方法内部会调用输入对象而first方法进行判断,并返回Success或Failure对象。

解析方法3:生成语法树

最后让我们看下start方法,这个方法就是对分词的结果进行匹配,并生成TreeNode。

这里使用到了非常强大的模式匹配,将select语句的各个部分解析出来,并形成了一个logicalPlan。

至此,sqlParse的过程完成。总而而言,对输入字符会进行两轮处理,第一轮是通过Scanner进行分词处理,第二轮是根据语法规则,将各个语句部分生成TreeNode。

小结

整个Spark中,有几个数据结构,RDD、broadcast、accumulator,各个子框架都需要用RDD来存储数据。

我们传递了两个观点:
1.无论是哪个子框架,最终肯定是被rdd来存储的,一般只不过是在构建时会使用一个新的数据结构,比如sparksql是用树的方式来构建。
2.上面的算法调度执行引擎等一般都是依赖spark core,并加入自己基于这个数据结构领域框架需要的特色。

欲知后事如何,且听下回分解!

DT大数据每天晚上20:00YY频道现场授课频道68917580

Catalyst揭秘 Day3 sqlParser解析的更多相关文章

  1. Catalyst揭秘 Day4 analyzer解析

    Catalyst揭秘 Day4 analyzer解析 今天继续解析catalyst,主要讲一下analyzer,在sql语句的处理流程中,analyzer是在sqlparse的基础上,把unresol ...

  2. Catalyst揭秘 Day5 optimizer解析

    Catalyst揭秘 Day5 optimizer解析 Optimizer是目前为止中catalyst中最重要的部分.主要作用是把analyzed logicalPlan变成optimized Log ...

  3. Catalyst揭秘 Day6 Physical plan解析

    Catalyst揭秘 Day6 Physical plan解析 物理计划是Spark和Sparksql相对比而言的,因为SparkSql是在Spark core上的一个抽象,物理化就是变成RDD,是S ...

  4. Catalyst揭秘 Day1 Catalyst本地解析

    Catalyst揭秘 Day1 Catalyst本地解析 今天开始讲下Catalyst,这是我们必须精通的内容之一: 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是D ...

  5. Catalyst揭秘 Day2 Catalyst源码初探

    Catalyst揭秘 Day2 Catalyst源码初探 这节课从源码角度来讲catalyst. 首先有一个观点要澄清,就是技术不是越底层就越是性能和效率更高.因为除了指令执行性能以外,更重要的是架构 ...

  6. Catalyst揭秘 Day8 Final 外部数据源和缓存系统

    Catalyst揭秘 Day8 Final 外部数据源和缓存系统 今天是Catalyst部分的收官,主要讲一些杂项内容. 外部数据源处理 什么叫外部数据源,是SparkSql自己支持的一些文件格式,以 ...

  7. Catalyst揭秘 Day7 SQL转为RDD的具体实现

    Catalyst揭秘 Day7 SQL转为RDD的具体实现 从技术角度,越底层和硬件偶尔越高,可动弹的空间越小,而越高层,可动用的智慧是更多.Catalyst就是个高层的智慧. Catalyst已经逐 ...

  8. Spark Tungsten揭秘 Day3 内存分配和管理内幕

    Spark Tungsten揭秘 Day3 内存分配和管理内幕 恭喜Spark2.0发布,今天会看一下2.0的源码. 今天会讲下Tungsten内存分配和管理的内幕.Tungsten想要工作,要有数据 ...

  9. Kakfa揭秘 Day3 Kafka源码概述

    Kakfa揭秘 Day3 Kafka源码概述 今天开始进入Kafka的源码,本次学习基于最新的0.10.0版本进行.由于之前在学习Spark过程中积累了很多的经验和思想,这些在kafka上是通用的. ...

随机推荐

  1. jQuery Validate 插件[表单验证]

    在客户端添加信息提交表单时我们经常需要做一些验证,比如验证不能为空,验证客户输入手机格式,验证客户输入email,url等的格式,我们可以通过EL表达式结合js 进行自主验证,今天总结一个JQuery ...

  2. cocos2d-x使用ant打包

    1. 下载apache-ant-1.9.3,然后添加环境变量ANT_HOME = D:\dev_envir\apache-ant-1.9.3(你自己的ant根目录),再在path中添加路径:%ANT_ ...

  3. 无限滚动 --demo

    <!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...

  4. idl 批量裁剪代码

    PRO Subset_via_shp_update COMPILE_OPT idl2 ENVI,/restore_base_save_files envi_batch_init,LOG_FILE='b ...

  5. SSIS 学习(3):数据流任务(下)【转】

    前一篇文章SSIS 学习(2):数据流任务(上), 介绍了如何创建一个简单的ETL包,如何通过一个简单的数据流任务,将一个文本文件的数据导入到数据库中去.这些数据都保持了它原有的本色,一个字符不 多, ...

  6. android网络请求之POST方法

    package com.jredu.helloworld.activity; import android.os.Bundle; import android.os.Handler; import a ...

  7. Android数据库的使用

    学了web好久没继续做,现在做android开发断断续续也近一年了,实习是android,现在毕业了工作也是android,但是对于数据库这块由于最近项目需要就研究了下其常用操作,这篇博客中的观点仅代 ...

  8. Windows Azure 微软公有云体验(一) 网站、SQL数据库、虚拟机

    Windows Azure 微软公有云已经登陆中国有一段时间了,现在是处于试用阶段,Windows Azure的使用将会给管理信息系统的开发.运行.维护带来什么样的新体验呢? Windows Azur ...

  9. 【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别

    在Activity中可以直接使用Intent启动另一个Activity 显式Intent intent = new Intent(context, activity.class) 隐式 Intent ...

  10. html的标签中 unselectable=on 属性的作用

    在IE浏览器中,当input获得焦点时,点击有unselectable="on"属性的标签时,不会触发onblur事件. 加上该属性的元素不能被选中. < !DOCTYPE ...