这是我参与「第四届青训营 -大数据场」笔记创作活动的的第1篇笔记
为什么大数据领域中SQL特别受欢迎?
sql可以让版本维护的成本降到非常低,并且提高维护的速度
SQL的一生
sql从编译→执行→查询出来结果这个过程中经历了什么?
上图是一个sql从编译到执行的简易流程图
-
Parser模块,他会对一条sql语句进行切分,组合成一颗抽象语法树
举个例子,select a from b where xxx ,按照下图所示的语法树中,selectList里就是a,FromClause里就是b,WhereClause里就是xxx
- Analayzer模块,他会去检查sql写的是不是正确的,然后把这颗抽象语法树上的节点和数据、函数进行绑定,替换为一个逻辑计划
SELECT country.name, SUM(weblog.bytes) as total FROM country
INNER JOIN geoip ON country.id = geoip.country_id
INNER JOIN weblog ON geoip.host = weblog.host
WHERE weblog.reply = "200" and weblog.host is not null
GROUP BY country.name
ORDER BY total
LIMIT 10
比如是这样一个sql语句,就会转换为下面这样的逻辑计划树,最下面是三个表名,然后通过SCAN中绑定sql语句中的where筛选。JOIN将两张表进行连接,AGGREGATE是一些groupby操作,TopN是orderby和limit操作。以这样的连接规则这样构成一张logical plan
-
Optimizer模块,是整个流程中最核心的模块。他是对这个逻辑计划进行优化,不然执行效率是非常慢的。这里主要学习两个最关键的优化器(RBO、CBO)
-
RBO是基于规则进行优化,列裁剪、谓词下推等
- 列裁剪:只要查特定列,那就在扫描前把这个列提前筛选出来
- 谓词下推:在两个表进行join之前,先根据查询条件进行一波筛选,这样join的数据量就减少了
-
CBO是基于代价的优化。比如一条sql翻译成spark有几个算子可以选择,估算一下哪个算子代价最低,选这个就完事了。具体可以用贪心或者动态规划的方法,这里不详细介绍了
-
-
最后以sparksql为例,用最优的执行计划生成java字节码,将SQL转化为DAG,用RDD计算