Spark之SparkSQL内核解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34993631/article/details/86602182

SparkSQL内核解析

使用SparkSQL引擎去解析SQL与其它的SQL执行引擎也是非常相似的,都要进过未解析逻辑计划-->解析后的逻辑计划-->逻辑计划优化-->物理计划-->执行物理计划等步骤。下面我们详细说明。

生成未解析的逻辑计划

我们在Spark中执行SQL语句就要用到SQLContext的sql()方法,这个方法底层会调用SQLParser组件去生成一个未解析的逻辑计划,它的返回结果是一个DataFrame或者说是Dataset。但是这个过程具有lazy的特性,也就是说我们生成的DataFrame不是一个数据集而只是一个未解析的逻辑计划的封装。而真正执行剩余步骤的是当这个DataFrame遇到show()这样的操作时才会触发。(这一点很像RDD的lazy特性)。同时生成的这个逻辑计划中不涉及数据源等信息只是纯语法的骨架。

生成解析过的逻辑计划

当我们真正针对数据进行查询并返回结果的时候,就会触发SQLContext中的executeSql()并且返回一个QueryExecution,这个对象会贯穿SQL执行的剩余流程。QueryExecution会调用Analyzer的apply()方法,来将逻辑计划生成为解析后的逻辑方法。这一步的意义就是我们的执行计划不再是纯的语法了而是将一些参数与语句绑定起来,比如说数据来自于哪种数据库,哪张表。

将逻辑计划进行优化

这一步主要是将我们生成的逻辑计划进行优化,根据优化算法合并减少不必要的步骤选择更优的策略。核心组件是Optimizer。当然我们可以利用人脑来写出效率优良的SQL这样可以减少一些优化算法带来的计算。提高效率。这部分笔者暂时没有很明显的体会。如果有一天感觉来了会回来做个补充。

生成物理计划并执行

这一步SparkPlan会将优化过后的逻辑计划解析成为物理计划即PhysicalPlan。物理计划是最精确的计划,我们已经知道了连接哪些数据源,如何join,优化的时候使用怎样的广播策略等等。最后我们可以调用SparkPlan的execute()直接执行物理计划。返回一个泛型为Row的RDD。

至此我们成功的执行了一条SparkSQL语句。

最后感谢石杉老师!

 

猜你喜欢

转载自blog.csdn.net/qq_34993631/article/details/86602182