SPARK SQL运行原理
正常的SPARK SQL执行会先经过SQL Parser解析SQL,然后经过Catalyst优化器处理,最后到spark执行,其中包括以下几个重要的部分:
- SQL Parse:sql解析器将sql解析为抽象语法树,即Unresolved Logical Plan
- Analysis:利用Catalog信息将Unresolved Logical Plan解析成Analyzed Logical plan
- Logical Optimization:利用一些规则将Analyzed Logical plan解析成Logic plan
- Physical Planning:Logical plan是不能被spark执行的,而这个过程是把Logic plan转换为多个Physical plans,然后利用代价模型选择最佳的physical plan;
- Code Generation:sql逻辑生成Java字节码
一、SQL文本解析
-- 测试代码 select a.id, a.mount, b.mount from ( (select id, mount from t1 where city = '上海' and area_id != null) a left outer join (select id, mount from t1 where city = '重庆' and area_id != null) b on a.id = b.id ) tmp where a.mount >= 100
-- 在spark中查看逻辑执行计划, 打印如下,抽象语法树,
val spark = SparkSession.build().master("local[*]").appName("parse").getOrCreate()
spark.sessionState.sqlParser.parsePlan(sql)
二、逻辑计划绑定元数据
frame.explain("extended") // explain默认打印的是物理执行计划,extended物理和逻辑都打印
三、优化逻辑计划