【转】SparkSQL sql解析

原文:

1. 背景

搞了快两年OLAP平台的开发,其中sql的解析优化通过SparkSQL完成,这里简单介绍一下原理

2. Demo

假设你已经搭建了spark,hive环境,我们这边查询下hive表,代码如下:

这里主要做了三件事:

1、构建SparkSession

2、执行sql构建DataFrame

3、调用show方法触发action操作,展示结果,调用queryExecution.toString则可以打印各个阶段逻辑计划

3. 流程解析

这里我们主要研究上述Demo步骤2的流程,对SparkSQL有一定了解的同学肯定知道,一条sql进来,要经历五大解析阶段:

1、初步解析为Unresolved LogicalPlan

2、绑定schema信息解析为Analyzed LogicalPlan,规则见Analyzer类batches

3、结合RBO,CBO规则优化为Optimized LogicalPlan,规则见SparkOptimizer类defaultBatches

4、将Optimized LogicalPlan转化为物理计划Physical Plan,并选择可以执行的(目前选择第一个,未能实现真正意义上的CBO)

5、将可执行的Physical Plan转化为RDD[InternalRow],最终返回QueryExecution对象,并用这玩意结合schema信息构建DataFrame

上述各个LogicalPlan的构建的执行方法均在RuleExecutor的execute方法中,对于优化阶段Optimized LogicalPlan的构建,无非是遍历一个个优化规则调用apply方法,将树形结构的LogicalPlan作为参数传入,自底向上或者自顶向下遍历,case匹配进行转换,返回新的LogicalPlan,然后作为参数应用于下一个优化规则

4. 结语

有了上述知识,咱们如果要基于SparkSQL进行OLAP平台开发,继承BaseSessionStateBuilder类, 扩展解析、优化、物理三个部分的规则即可。

posted @ 2022-04-08 16:19  江东邮差  阅读(210)  评论(0编辑  收藏  举报