当前位置:首页 » 编程语言 » sql到抽象语法树转换
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql到抽象语法树转换

发布时间: 2023-05-04 21:19:09

㈠ 怎样将一个sql语句转化为相应的语法树

token就是把程序的语句进行类似分词得到的单词。
它是下步语法分析的输入。
typedef struct Token
{
int label;
char name[buf];
int code;
}Token;
是一个结构体。
C语言中单词可以分为
保留字,就是int,while等。
标识符,例如int m;m就是标识符。
数字,有整数和小数
字符,+,-,.,*,;等字符,其中也包括++,--,!=等。
label应该标识token的类型。
name表示的就是程序中对应的字符序列。例如:int等。
最后code的意思,看不出来。。。,不过个人认为,上面的两项就可以表示
token的信息。

㈡ MySql中Sql的执行过程

如果查询缓存没有命中,那么SQL请求会进入分析器,分析器是用来分辨SQL语句的执行目的,其执行过程大致分为两步:

表1 语法分析关键字然后再通过语法规则解析,判断输入的SQL 语句是否满足MySQL语法,并且生成图5的语法树。由SQL语句生成的四个单词中,识别出两个关键字,分别是select 和from。根据MySQL的语法Select 和 from之间对应的是fields 字段,下面应该挂接username;在from后面跟随的是Tables字段,其下挂接的是userinfo。

优化器的作用是对SQL进行优化,生成最有的执行方案。如图6所示,前面提到的SQL解析器通过语法分析和语法规则生成了SQL语法树。这个语法树作为优化器的输入,而优化器(黄色的部分)包含了逻辑变换和代价优化两部分的内容。在优化完成以后会生成SQL执行计划作为整个优化过程的输出,交给执行器在存储引擎上执行。

所处的位置如上图所示,这节的重点在优化器中的逻辑变换和代价优化上。

逻辑变换也就是在关系代数基础上进行变换,其目的是为了化简,同时保证SQL变化前后的结果一致,也就是逻辑变化并不会带来结果集的变化。其主要包括以下几个方面:

这样讲概念或许有些抽象,通过图7 来看看逻辑变化如何在SQL中执行的吧。

如图7所示,从上往下共有4个步骤:
1. 针对存在的SQL语句,首先通过“否定消除”,去掉条件判断中的“NOT”。语句由原来的“or”转换成“and”,并且大于小于符号进行变号。蓝色部分为修改前的SQL,红色是修改以后的SQL。2. 等值传递,这一步很好理解分别降”t2.a=9” 和”t2.b=5”分别替换掉SQL中对应的值。3. 接下来就是常量表达式计算,将“5+7”计算得到“12”。4. 最后是常量表达式计算后的化简,将”9<=10”化简为”true”带入到最终的SQL表达式中完成优化。

代价优化是用来确定每个表,根据条件是否应用索引,应用哪个索引和确定多表连接的顺序等问题。为了完成代价优化,需要找到一个代价最小的方案。因此,优化器是通过基于代价的计算方法来决定如何执行查询的(Cost-based Optimization)。简化的过程如下:

这里将配置操作的代价分为MySQL 服务层和MySQL 引擎层,MySQL 服务层主要是定义CPU的代价,而MySQL 引擎层主要定义IO代价。MySQL 5.7 引入了两个系统表mysql.server_cost和mysql.engine_cost来分别配置这两个层的代价。如下:MySQL 服务层代价保存在表server_cost中,其具体内容如下:

由上可以看出创建临时表的代价是很高的,尤其是内部的myisam或innodb临时表。MySQL 引擎层代价保存在表engine_cost中,其具体内容如下:

目前io_block_read_cost和memory_block_read_cost默认值均为1,实际生产中建议酌情调大memory_block_read_cost,特别是对普通硬盘的场景。MySQL会根据SQL查询生成的查询计划中对应的操作从上面两张代价表中查找对应的代价值,并且进行累加形成最终执行SQL计划的代价。再将多种可能的执行计划进行比较,选取最小代价的计划执行。

当分析器生成查询计划,并且经过优化器以后,就到了执行器。执行器会选择执行计划开始执行,但在执行之前会校验请求用户是否拥有查询的权限,如果没有权限,就会返回错误信息,否则将会去调用MySQL引擎层的接口,执行对应的SQL语句并且返回结果。例如SQL:“SELECT * FROM userinfo WHERE username = 'Tom';“假设 “username“ 字段没有设置索引,就会调用存储引擎从第一条开始查,如果碰到了用户名字是” Tom“, 就将结果集返回,没有查找到就查看下一行,重复上一步的操作,直到读完整个表或者找到对应的记录。需要注意SQL语句的执行顺序并不是按照书写顺序来的,顺序的定义会在分析器中做好,一般是按照如下顺序:

如果命中的记录比较多,应用会从MySql Server一批批获取数据

本文从MySQL中SQL语句的执行过程作为切入点,首先介绍了查询请求的执行流程,其中将MySQL的处理分为MySQL Server层和MySQL存储引擎层。通过介绍SQL语句的流转,引出了后面要介绍的5大组件,他们分别是:连接器、查询缓存、分析器、优化器、执行器。后面的内容中对每个组件进行了详细的介绍。连接器,负责身份认证和权限鉴别;查询缓存,将查询的结果集进行缓存,提高查询效率;分析器,对SQL语句执行语法分析和语法规则,生成语法树和执行计划;优化器,包括逻辑变换和代价优化;执行器,在检查用户权限以后对数据进行逐条查询,整个过程遵守SQL语句的执行顺序。

㈢ mybatis中动态sql执行原理

解释器模式: 初始化过程中构建出抽象语法树,请求处理时根据参数对象解释语法树,生成sql语句。
工厂模式: 为动态标签的处理方式创建工厂类(SqlTagHandlerFactory),根据标签名称获取对应的处理方式。
策略模式: 将动态标签处理方式抽象为接口,针对不同标签有相应的实现类。解释抽象语法树时,定义统一的解释流程,再调用标签对应的处理方式完成解释中的各个子环节

㈣ Hive入门概述

1.1 什么是Hive

Hive:由Facebook开源用于解决海量结构化日志的数据统计。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。本质是:将HQL转化成MapRece程序

Hive处理的数据存储在HDFS

Hive分析数据底层的实现是MapRece

执行程序运行在Yarn上

1.2 Hive的优缺点

1.2.1 优点

操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

避免了去写MapRece,减少开发人员的学习成本。

Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。

Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

1.2.2 缺点

1.Hive的HQL表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长

2.Hive的效率比较低

(1)Hive自动生成的MapRece作业,通常情况下不够智能化

(2)Hive调优比较困难,粒度较粗

1.3 Hive架构原理

1.用户接口:Client

CLI(hive shell)、JDBC/ODBC(java访问hive)、WEBUI(浏览器访问hive)

2.元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL替代derby存储Metastore

3.Hadoop

使用HDFS进行存储,使用MapRece进行计算。

4.驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapRece,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。

1.4 Hive和数据库比较

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。本文将从多个方面来阐述 Hive 和数据库的差异。数据库可以用在 Online 的应用中,但是Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。

1.4.1 查询语言

由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。

1.4.2 数据存储位置

Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中的。而数据库则可以将数据保存在块设备或者本地文件系统中。

1.4.3 数据更新

由于Hive是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET修改数据。

1.4.4 索引

Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key建立索引。Hive要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于 MapRece 的引入, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据的访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。

1.4.5 执行

Hive中大多数查询的执行是通过 Hadoop 提供的 MapRece 来实现的。而数据库通常有自己的执行引擎。

1.4.6 执行延迟

Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapRece框架。由于MapRece 本身具有较高的延迟,因此在利用MapRece 执行Hive查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势。

1.4.7 可扩展性

由于Hive是建立在Hadoop之上的,因此Hive的可扩展性是和Hadoop的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009年的规模在4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。

1.4.8 数据规模

由于Hive建立在集群上并可以利用MapRece进行并行计算,因此可以支持很大规模的数据;对应的,数据库可以支持的数据规模较小。

㈤ Hive 怎么将HQL转换为MR作业

Shark为了实现Hive兼容,在HQL方面重用了Hive中HQL的解析、逻辑执行计划翻译、坦信羡执行计划优化等逻辑,可以近似认为仅将物理执行计划从MR作业替换成了Spark作业(辅以内存列式存储等各种和Hive关系不大的优化);
同时还依赖Hive Metastore和Hive SerDe(用于兼容现有的各种Hive存储格式)。这一策略导致了两个问题,
第一是执行计划优化完全依赖于Hive,不方便添加新的优化策略;
二是因为MR是进程级并行,写代码的时候不是很注意线程安全问题,导致Shark不得不使用另外一套独立维护的打了补丁的Hive源码分支(至于为何相关修改没有合并到Hive主线,我也不太清楚)。

Spark SQL解决了这两个问题。第一,坦颤Spark SQL在Hive兼容层面仅依赖HQL parser、Hive Metastore和Hive SerDe。也就是说,从HQL被解析成抽象语法树(AST)起,就全部由Spark SQL接管了。执行计划生成和优化都由Catalyst负责。借助Scala的模式匹配等函数式语言特性,利用Catalyst开发让拍执行计划优化策略比Hive要简洁得多。

㈥ flink血缘解析原理分析

参考dlink实现血缘解析程序流程图

对于经过parse阶段解析出的AST语法树结果需要进行有效性校验,SqlToOperationConverter.convert(planner, this.catalogManager, parsed)方法负责校验sql语句,并将其转为Operation。该方法内部首先会对解析后的SQL语法树进行校验。具体验证的方面主要包括以下两方面,1.表名、字段名、函数名是否正确,如在某个查询的字段在当前SQL位置上是否存在或有歧义;2.特定类型操作自身的合法性,如group by聚合中的聚合函数是否存在嵌套调用,使用AS重命名时,新名字是否是x.y的形式等。使用flinkPlanner.validate(sqlNode)方法会拿到校验后的SqlNode变量,会判断SqlNode的类型,采用不同的转换逻辑最终获得需要的Operation对象。

rel阶段是将SqlNode组成的一棵抽象语法树转化为一棵由RelNode和RexNode组成的关系代数树,并且此阶段只处理DML与DQL,因为DDL实际上可以认为是对元数睁态好据的修改,不涉及复杂关系查询,也就不用进行关系代数转换来优悉铅化执行,所以也无需转换为表示,根据对应的SqlNode中保存的信息已经可以直接执行了。对于DML语句会执行converter.convertSqlQuery(validated),该方法内部会先创建出Rel转换器,由Calcite转换为Relation tree,最终生成一个PlannerQueryOperation。将Calcite转换成的reletional tree包装在其中,对于转换过程本身并不涉及很复杂的算法,大部分过程都是提取已有SqlNode节点中记录的信息,然后生成对应的RelNode和RexNode,并设置RelNode间的父子关系。

在Translate阶段,通过Blink Planner 的translateToRel、optimize、StreamGraph和ObjectNode四个阶段:将Operation转换成 ObjectNode。从operation开始,先将ModifyOperation通过translateToRel方法闭橡转换成Calcite RelNode逻辑计划树。在Explainer#translateObjectNode()方法内部可以会先将modifyOperations数组组装出来,然后通过PlannerBase#translate(modifyOperations)方法获取到Transformation数组。并将其作为参数传入ExecutorUtils#generateStreamGraph()方法获取到StreamGraph。在Executor#getStreamGraph()方法中通过使用JSONGenerator,ObjectMapper进行封装最后返回ObjectNode。然后通过TransGenerator(plan).translateTrans()获取ObjectNode里的节点信息最后组装成Trans数组,以便后续得到最终的实体对象LineageColumnGenerator。

㈦ hive核心组件及流程(一)

依赖第三方组件: Meta store(mysql),hdfs,MapRece
hive:
Client客户端 CLI、JDBC
Driver连接客户端与服务端的桥梁
SQL Pareser解析器,将SQL转换为抽象语法树AST
1.将HQL语句转换为Token
2.对Token进行解析,生成AST
Physical Plan编译器将AST编译生成逻激虚帆辑誉磨执行计划
Query Optimizer优化器,对逻辑执行计划进行优化
1.将AST转换为QueryBlock
2.将QueryBlock转换为OperatorTree
3.OperatorTree进行逻辑优化
4.生成TaskTree
5.TaskTree执行物理优化
Execution执行器把逻辑执行计划转换成可以运行的物理计划
1.获取MR临时工作目录
3.定义Mapper和Recer
2.定义Partitioner
4.实例化Job
5.提交Job

1.以Antlr定义的语法规则,对SQL完成词法解析,将SQL转换为AST
2.遍历AST,抽象出查询基本组成单元QueryBlock。
3.遍历QueryBlock,将其转换为OperatorTree,逻辑执行单元
4.利用逻辑优化器对OperatorTree进行逻辑优化。
5.遍历OperatorTree转换为TaskTree,将逻辑执行计划转化为物理执行计划
6.使用物理优化器对TaskTree进行物理优化
7.生成最终的执行计划,提交执行

$HIVE_HOME/bin/hive可以进入客户端

$HIVE_HOME/bin/hive -e "{SQL语句}"可以执行SQL语句

$HIVE_HOME/bin/hive -f {SQL文件名.sql}可以执行sql文件

开启hiveserver2服务,可以通过JDBC提交SQL

创建Driver
创建OptionsProcessor
初始化log4j
标准输入输出以及错误输出流的定义,后续需要输入 SQL 以及打印控制台信息
解析输入的参数,包含"-e -f -v -database"
读取输入的sql
按照";"分割的方式解析
解析单行SQL
遇到为"quit"或者"exit"退出
遇到为"source"开头,执行 SQL 文件,读取文件并解析
如果命令以"!"开头,则表示用户需要执行 shell命令
以上三种都不是的情况下执行SQL,进行SQL解析

获取当前系统时间
获取系统结束时间
编译SQL语句
SQL生成AST,构建词法解析器,将关键词替换为TOKEN,明雹进行语法解析,生成最终AST
处理AST,转换为QueryBlock然后转换为OperatorTree,对Operator进行逻辑优化,然后转换为任务树,然后进行物理优化。
根据任务树构建MrJob
添加启动任务,根据是否可以并行来决定是否并行启动Task
设置MR任务的InputFormat、OutputFormat 等等这些 MRJob 的执行类
构建执行MR任务的命令
向yarn提交任务
打印头信息
获取结果集并获取抓取到的条数
打印SQL执行时间及数据条数

㈧ sql关系代数表达式改为语法树减法怎么写

首先先介绍概念,对于查询处理,一般分为三个步骤:

对SQL语句进行语法分析,即将查询语句转换成按照某种有用方式表示查询语句结构的语法树
把语法分析树转换成关系代数表达式树(或某种类似标记),一般称之为逻辑查询计划
逻辑查询计划必须转换成物理查询计划,物理查询计划不仅指明了要执行的操作,而且也找出了这些操作执行的顺序、执行每步所用的算法,获得所存储数据的方式以及数据从一个操作传递给另一个操作的方式,除此之外,还必须估计每个可能选项的预计代价。
以下是详细的步骤。

查询的编译

1:语法分析与预处理

语法分析与语法分析树
原子
语法类
SQL简单子集的语法(语法分析)
查询

㈨ 急求设计SQL语言的语法树

看是用在asp中或是易语言中,abc是变量还是常量,另外是不是模糊查询,这样一来就要分好几种情况了(以下代码不含模糊查询,如果要用需要加%号):
一、abc为常量
不分易语言和asp
如果字段1-4是文本内容,sql语句如下:
"select
*
from
表1
where
字段1
like
'abc'
and
字段2
like
'abc'
and
字段3
like
'abc'
and
字段4
like
'abc'"
如果字段1-4是数值内容,sql语句如下:
"select
*
from
表1
where
字段1=abc
and
字段2=abc
and
字段3=abc
and
字段4=abc"
二、abc为变量
如果字段1-4是文本内容,sql语句如下:
asp中:
“select
*
from
表1
where
字段1
like
'”&abc&"'
and
字段2
like
'”&abc&"'and
字段3
like
'”&abc&"'and
字段4
like
'”&abc&"'"
易语言中:
”select
*
from
表1
where
字段1
like
'“+abc+”'
and
字段2
like
'“+abc+”'
and
字段3
like
'“+abc+”'
and
字段4
like
'“+abc+”'

如果字段1-4是数值内容,sql语句如下:
asp中:
“select
*
from
表1
where
字段1
=”&abc&"and
字段2
=”&abc&"and
字段3=”&abc&"and
字段4=”&abc&"
易语言中:
“select
*
from
表1
where
字段1
=”+abc+"and
字段2
=”+abc+"and
字段3=”+abc+"and
字段4=”+abc+"

㈩ 如何获取SQL2005下的SQL语句的语义分析

我想获取一段sql语句在 mssql2005下解析成的语句,
主要是想获取这个sql所用到的所有的表的名字。(ps:复杂的sql语句的)
请高手帮忙 在线等~
我的意思是要从用户输入的sql语句中提取该语句中所用的表
或者是:
sql 执行的步骤

1. 解析器

第 1 阶段是解析器阶段,它将 SQL 文本转换成语法树。这个阶段不查找系统目录中的任何信息,不访问数据库。

2. 语义分析

第 2 阶段分析由解析器创建的语法树,并产生用于查询的查询控制块和表达式树。要构建这些内部数据结构,它执行以下操作:

验证对象
解析 UDR
如果可能的话,消除常量
验证对象

第 2 阶段访问数据库中不同的系统目录,以验证查询所引用的所有数据库对象(诸如表、列、视图、类型、UDR 等等)是否都存在。它在数据库中找到这些对象的标识,然后创建查询控制块和表达式树。

我要的就是验证对象步骤里的表的信息