spark sql(三)逻辑计划解析(analyzer)

news2024/12/23 3:14:44

1、前言

        Spark SQL 逻辑计划在实现层面被定义为 LogicalPlan 类 。 从 SQL 语句经过 SparkSqlParser解析生成 Unresolved LogicalPlan ,到最终优化成为 Optimized LogicalPlan ,这个流程主要经过3 个阶段。 这 3 个阶段分别产生 Unresolved LogicalPlan, Analyzed LogicalPlan 和Optimized LogicalPlan ,其中 Optimized LogicalPlan 传递到下一个阶段用于物理执行计划的生成。前面文章介绍了spark sql的大体执行流程,在逻辑计划的生成阶段,仅仅介绍了通过SqlParser、Analyzer、Optimizer工具类对sql语句或逻辑计划进行处理。对于具体的解析详情并没有深入研究。本篇文章主要是想深入看下未解析逻辑计划(Unresolved LogicalPlan)到解析后逻辑计划(Analyzed LogicalPlan)的转换过程,例如数据源的确定、表字段的确定等。

2、源码探究

        经过SqlParser的解析,SQL语句会转变成一颗语法树,此时这个语法树就称为未解析逻辑计划(Unresolved LogicalPlan)。之所以称为“未解析”,其实是因为语法树上面的库表字段信息还没有和实际的数据源对应上。所以接下来就需要Analyzer工具类对未解析的逻辑计划进行进一步的处理,将语法树中的库表字段等和实际的数据源关联上。从而将语法树转换成解析后的逻辑计划。因为整个解析规则太多太杂,如果整个铺开研究源码,不仅效率低下,很有可能越看越懵。所以这里挑一个我感兴趣的点去追踪探究,我这里挑选的是数据源的解析,简单理解为库表的解析。代码demo如下:

 def main(args: Array[String]): Unit = {
    //1、创建sparkSession
    val sparkSession = SparkSession.builder
      .appName("test")
      .master("local")
      .getOrCreate

    import org.apache.spark.sql.types._

    //2、构造数据
    val schema = StructType(
      List(StructField("id", IntegerType, nullable = false),
        StructField("name", StringType, nullable = false),
        StructField("age", IntegerType, nullable = false))
    )
    val rdd = sparkSession.sparkContext.parallelize(Seq(
      Row(1, "xiaohong", 34),
      Row(2, "xiaoli", 42),
      Row(3, "xiaoming", 28),
    ))
    val df = sparkSession.sqlContext.createDataFrame(rdd, schema)

    //3、创建临时表
    df.createOrReplaceTempView("person")

    //4、查询展示
    val df2 = sparkSession.sql("select id,name from person where age > 30")
    df2.show()

  }

代码的大体执行流程前面文章已经介绍过了,Analyzer段执行的逻辑在父类RuleExecutor中定义好了,但是具体的解析规则batches则由Analyzer中定义,所以我们这里直接到Analyzer中查看对应的batches,然后再对应的处理方法中加断点查看解析的规则。

 Resolution规则太多,所以给折叠起来了,它也是解析的主要规则批。我现在使用的spark版本是3.0.1,可以看到总共有12大类解析规则。我们感兴趣的库表解析其实在关系策略组Resolution中,具体的解析类为ResolveRelations:

 下面来看下ResolveRelations相关的代码,这里我是通过断点进去看的,也建议初次看的时候也根据断点来。打断点的流程首先是取消所有断点,然后只在查询语句前加断点,随后在ResolveRelations中加入断点。如下:

 首先进入ResolveRelations的apply方法中,这块有两个重点,第一是解析临时表ResolveTempViews方法,其包含了解析临时表的关键内容。第二个是resolveOperatorsUp,它表示自底向上遍历所有节点,即后序遍历语法树(还有一个resolveOperatorsDown,它表示自上向下遍历所有节点,即前序遍历语法树)。

接着看下ResolveTempViews方法:

 可以看到语法树底层是UnresolvedRelation,所以模式匹配肯定进入第一个case中,即会接着执行lookupTempView(ident)方法。

因为 还没解析,且入参只有一个,所以identifier的模式匹配也只会匹配第一个case:

这块有两个重点,第一是会格式化输入的表名,大体是根据表名是否大小写敏感进而进行转换,该参数可以自定义配置。第二个则是获取表的logicplan并封装成子查询SubqueryAlias。接着进入getTempView中看下:

 可以看到该方法逻辑比较简单,就是从一个hashmap中取出logincal对象并返回。该hashmap点击查看其对应的put方法可以看到,只在两个地方put,一个是创建view的时候,还有就是重命名的时候。

而我们的代码demo中,因为没有查数据库,而是在内存造的数据并注册成view,因此hashmap中就有了person表相关的信息。

引申:至此demo中整个表的解析就结束了。但是由于我们查询的是自己注册的view,所以在查询解析数据源的过程比较简单,当我们查询数据库或其它数据源的时候就比较复杂了 。不过他们的入口还是在ResolveRelations中。

 这里的代码不过多解析,感兴趣的可以自己看下,后面会有一篇自定义数据源相关的文章,那个时候我会结合这块代码详细介绍下。

 3、总结

spark sql的解析规则太多,很多我其实也没有看到,只是在用到或者感兴趣的时候再去看下大体的解析逻辑,所以如果有介绍不到位的地方,希望大家多多指教。

最后分享给大家一个spark sql查询的技巧,那就是通过配置,让spark sql执行中生效的规则以及规则的处理前后结果打印出来,如下:

可以看到在Resolution策略批中,生效的规则有ResolveRelations和Reference,前者负责库表解析,后者负责字段解析。另外spark.sql.optimizer.planChangeLog.level=WARN只适用于spark3.1.0之前的版本,后续的版本使用spark.sql.planChangeLog.level=WARN配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/386744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

组合模式-文件目录管理

什么是组合模式? 组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表现"部分-整体"的层次结构。组合模式使得客户端可以统一地对待单个对象和对象组合,从而使得系统更加灵活。 在组合模式中,有两种基本类…

SQL开发管理工具,SQL Studio成数据库管理工具热门

达梦数据库冲击IPO成功;麒麟软件等国产Linux桌面操作系统在国防、教育等行业达到百万规模级应用;阿里云计算操作系统取得重大突破,阿里云市场份额全球第三;宝兰德、中创等厂商的应用服务器中间件能够实现对IBM和Oracle相关产品的替…

Linux学习第十一节-磁盘类型介绍和挂载

1.磁盘类型介绍 IDE接口类型:主要用于个人家用计算机领域,优点价格便宜,缺点数据传输速度慢; SCSI接口类型: 主要用于服务器领域,数据传输速度快,支持热插拔; SATA接口类型&…

Android Automotive 调节音量的过程

Android Automotive OS (AAOS) 是在核心 Android 系统的基础之上打造而成,以支持将 Android 系统用作车辆信息娱乐系统的场景。AAOS 的音频系统对核心 Android 音频系统做了扩充,创建了新的概念和抽象,如音区等,提供了新的 API 接…

〖大前端 - 基础入门三大核心之 html 篇⑩〗- 图片标签

大家好,我是 哈士奇 ,一位工作了十年的"技术混子", 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬 &#x1f4e…

如何利用github搭建个人主页网站?

本章教程告诉你如何利用github搭建一个个人静态主页网站。 适合没有服务器和域名且对网站搭建感兴趣的人玩玩,github稳定性可能差一点。 目录 一、前期准备工作 二、 创建项目仓库 三、将网站上传到github 四、我的个人主页展示 一、前期准备工作 1、首先&#x…

[1.1_1]计算机系统概述——操作系统的概念、功能和目标

文章目录第一章 计算机系统概述操作系统的概念(定义)、功能和目标(一)操作系统的概念(定义)(二)操作系统的功能和目标1、作为系统资源的管理者2、向上层提供方便易用的服务3、作为最…

选课系统的设计与实现

技术:Java等摘要:目前国内各高校的规模越来越大,进而造成教师教学管理等工作量日趋加大。然而,现代教育的信息化、网络化已经成为教育发展的一个重要方向,同时也为解决高校教学管理效率低下的现状,使管理突…

[架构之路-126]-《软考-系统架构设计师》-操作系统-5-虚拟化技术、Docker与虚拟机比较

第1章 Docker与虚拟机比较总体概述1.1 宏观比较虚拟机和Docker容器技术都是一种虚拟化技术。虚拟机包含的是整个操作系统的原生镜像,非常的庞大。docker的镜像只包含最核心的环境,非常小巧。(1)比较Docker与虚拟机技术的不同&…

【CS224W】(task9)图神经网络的表示能力(更新中!!)

note 基于图同构网络(GIN)的图表征网络。为了得到图表征首先需要做节点表征,然后做图读出。GIN中节点表征的计算遵循WL Test算法中节点标签的更新方法,因此它的上界是WL Test算法。 在图读出中,我们对所有的节点表征&…

线程基础复习

线程基础复习 程序:一段静态的代码 进程:正在执行的程序,是操作系统资源分配的最小单位 线程:进程可进一步细分为线程,是进程内部最小的执行单元,是操作系统进行任务调度的最小单元,属于进程 线程与进程的关系 一个进程可以包含多个线程,…

Python3-循环语句

Python3 循环语句 本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示: while 循环 Python 中 while 语句的一般形式: while 判断条件(condition):执行语句(stat…

Mysql是怎样运行的——B+树索引

💥 前章回顾: 💥 前面我们详细唠叨了InnnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的…

构建“以客户为中心”的新型商业模式

很难想象一个ERP系统能帮助企业变得更加以客户为中心。然而,如果采用正确的方法,ERP系统确实可以帮助你的企业把客户置于其所有规划、产品开发和运营的中心。 什么是以客户为中心的业务方法? 以客户为中心的业务方法将客户旅程放在每个行动…

图表控件LightningChart.NET 系列教程(九):LightningChart 组件——从工具箱添加至 WPF 项目

LightningChart.NET LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源,实时监控数据流。同时,LightningChart使用突破性创新技术,以实时优化为前提,大大提升了实…

将字符串生成艺术字pyfiglet.figlet_format

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串生成艺术字pyfiglet.figlet_format选择题以下关于python代码表述错误的一项是?import pyfigletmyText"python"print("【执行】pyfiglet.figlet_format")resultpyf…

第一篇:1.3Inch ISP Screen简介

1.简介官方连接: http://www.lcdwiki.com/zh/1.3inch_IPS_Module我在淘宝买的这款,其驱动IC是st7789,这款的分辨率是相对来说最高的,因此买的时候可能看到比他大的屏幕比这个还便宜.1.1产品介绍1.3寸IPS彩屏,支持 RGB 65K色显示,显示色彩丰富240X240分辨…

Vue2.0开发之——购物车案例-案例说明及导入Header(44)

一 概述 初始项目预览最终项目预览二 案例说明 2.1 初始项目代码结构 2.2 Components组件与项目的对应关系 对应关系: components/Counter:物品数量components/Footer:购物车底部components/Goods:购物车商品components/Header…

第二大脑应用程序Cogito

本文软件是网友 Juijote 推荐; 什么是 Cogito ? 官方号称是 又一个第二大脑应用程序,其实就是一个普通的笔记软件,但既不支持块操作、也不支持双链,更不具备现在流行的白板交互。 先来张官方图片感受一下 安装 在群晖…

Java之反射

反射机制1. Java反射机制的概念1.1 静态&动态语言1.2 反射机制概念1.3 反射机制研究与应用1.4 反射机制的优缺点2. 理解Class类并获取Class实例2.1 Class类介绍2.2 获取Class类的实例2.3 那些类型可以有Class对象?3. 类的加载与CassLoader3.1 Java内存分析3.2 类…