赞
踩
现有下面这段SQL语句
SELECT a.uid,b.name,SUM(clk_pv) AS clk_pv
FROM log a
JOIN user b ON a.uid = b.uid
WHERE a.fr = 'android'
GROUP BY a.uid,b.name
这段SQL是从日志表中拿出用户点击PV(clk_pv),再去和用户表关联,按照用户分组,再对点击pv求和,同时,还过滤了fr(平台)是android的数据,;这样一条SQL在Spark中或者说在数据库引擎中如何运行?
首先,有几个基本点:
SQL解析的顺序
SQL 文本 ---> ANLTRV4解析器-->未解析的逻辑计划 ---> 分析器 -->解析后的逻辑计划---> 优化器 -->优化后的逻辑计划 ---> 转换器 -->可执行的物理计划
SQL解析的思路
解析器的目的是将用户输入的文本,按照预置的关键词,语义等规则解析成一棵 AST。 后续,分析器、优化器,转化器,可对这棵树的节点按照规则遍历,并转换节点结构。
如上图,每个模块都可以理解为,对第一步产生的AST做节点变化操作。
对于最开始提出的SQL,第一步参数的未解析的逻辑计划如下:
这棵语法数的叶子节点是我们查的两张表,log,user,在往上一层,可看到,实际上是将我们的关联查询解析为两个子查询,再往上一次,是对这两个子查询做join,并按照匹配条件过滤,最后是按照我们所要的聚合条件做聚合投影(projection)
SQL
SQL语句在分析执行过程中会经历下图所示的几个步骤
语法解析
语法解析之后,会形成一棵语法树,如下图所示。树中的每个节点是执行的rule,整棵树称之为执行策略。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。