赞
踩
我们前面的文章已经说过spark RDD定义好后,执行经过DAG sechduler划分号内存管道、逻辑任务,然后经由task scheduler来分配到具体worker来管理运行,RDD的运行会完全按照开发者的代码执行
如果开发者水平有限,RDD的执行效率也会受到影响。
而SparkSQL会对写完的代码,执行自动优化”,以提升代码运行效率,避免开发者水平影响到代码执行效率。之所以RDD的的执行没法被优化,市因为RDD内含数据类型不限格式和结构,而DataFrame100%是二维表结构,可以被针对,SparkSQL的自动优化依赖于Catalyst优化器,它最终也是被优化成RDD来执行。
为了解决过多依赖Hive的问题,SparkSQL使用了一个新的SQL优化器替代Hive中的优化器,这个优化器就是Catalyst,整个SparkSQL的架构大致如下:
详细的流程如下:
catalyst第一步会将sql语句解析成抽象语法树,上面的语法树是从下往上看的
优化操作主要分两步:
(1)断言下推Predicate Pushdown
这一步会将将Filter或一些判断过滤类的可以减小数据集的操作下推,放在Scan的位置,这样可以减少操作时候的数据量。
SELECT sum(v)
FROM(
SELECT
score.id
100 + 80 + score.math_score AS v
FROM people
JOIN score WHERE people.id = score.id AND people.age > 10
)omp
如这个代码,正常流程是先JOIN然后做WHERE
断言下推后,会先过滤age,然后在JOIN,减少JOIN的数据量提高性能.
(2) 列值裁剪Column Pruning,在断言下推后执行裁剪,由于people表之上的操作只用到了id列,所以可以把其它列裁剪掉,这样可以
减少处理的数据量,从而优化处理速度,列值裁剪很适合parquet这种列值存储数据
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。