Spark之SparkSQL内核解析

大数据 专栏收录该内容
23 篇文章 0 订阅

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语句。

最后感谢石杉老师!

 

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值