返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Spark SQL的整体实现逻辑解析
  • 447
分享到

Spark SQL的整体实现逻辑解析

2024-04-02 19:04:59 447人浏览 薄情痞子
摘要

1、sql语句的模块解析    当我们写一个查询语句时,一般包含三个部分,select部分,from数据源部分,where限制条件部分,这三部

1、sql语句的模块解析

   当我们写一个查询语句时,一般包含三个部分,select部分,from数据源部分,where限制条件部分,这三部分的内容在sql中有专门的名称:

当我们写sql时,如上图所示,在进行逻辑解析时会把sql分成三个部分,project,DataSource,Filter模块,当生成执行部分时又把他们称为:Result模块、

DataSource模块和Opertion模块。

那么在关系数据库中,当我们写完一个查询语句进行执行时,发生的过程如下图所示:

wKiom1fJKQCTVTrjAAD82tMpcQg075.png-wh_50

整个执行流程是:query -> Parse -> Bind -> Optimize -> Execute

1、写完sql查询语句,sql的查询引擎首先把我们的查询语句进行解析,也就是Parse过程,解析的过程是把我们写的查询语句进行分割,把project,DataSource和Filter三个部分解析出来从而形成一个逻辑解析tree,在解析的过程中还会检查我们的sql语法是否有错误,比如缺少指标字段、数据库中不包含这张数据表等。当发现有错误时立即停止解析,并报错。当顺利完成解析时,会进入到Bind过程。

2、Bind过程,通过单词我们可看出,这个过程是一个绑定的过程。为什么需要绑定过程?这个问题需要我们从软件实现的角度去思考,如果让我们来实现这个sql查询引擎,我们应该怎么做?他们采用的策略是首先把sql查询语句分割,分割不同的部分,再进行解析从而形成逻辑解析tree,然后需要知道我们需要取数据的数据表在哪里,需要哪些字段,执行什么逻辑,这些都保存在数据库的数据字典中,因此bind过程,其实就是把Parse过程后形成的逻辑解析tree,与数据库的数据字典绑定的过程。绑定后会形成一个执行tree,从而让程序知道表在哪里,需要什么字段等等

3、完成了Bind过程后,数据库查询引擎会提供几个查询执行计划,并且给出了查询执行计划的一些统计信息,既然提供了几个执行计划,那么有比较就有优劣,数据库会根据这些执行计划的统计信息选择一个最优的执行计划,因此这个过程是Optimize(优化)过程。

4、选择了一个最优的执行计划,那么就剩下最后一步执行Execute,最后执行的过程和我们解析的过程是不一样的,当我们知道执行的顺序,对我们以后写sql以及优化都是有很大的帮助的.执行查询后,他是先执行where部分,然后找到数据源之数据表,最后生成select的部分,我们的最终结果。执行的顺序是:operation->DataSource->Result

虽然以上部分对sparkSQL没有什么联系,但是知道这些,对我们理解SparkSQL还是很有帮助的。

2、SparkSQL框架架构

要想对这个框架有一个清晰的认识,首先我们要弄清楚,我们为什么需要sparkSQL呢?个人建议一般情况下在写sql能够直接解决的问题就不要使用sparkSQL,如果想刻意使用sparkSQL,也不一定能够加快开发的进程。使用sparkSQL是为了解决一般用sql不能解决的复杂逻辑,使用编程语言的优势来解决问题。我们使用sparkSQL一般的流程如下图:

如上图所示,一般情况下分为两个部分:a、把数据读入到sparkSQL中,sparkSQL进行数据处理或者算法实现,然后再把处理后的数据输出到相应的输出源中。

1、同样我们也是从如果让我们开发,我们应该怎么做,需要考虑什么问题来思考这个问题。

     a、第一个问题是,数据源有几个,我们可能从哪些数据源读取数据?现在sparkSQL支持很多的数据源,比如:Hive数据仓库JSON文件,.txt,以及orc文件,同时现在还支持jdbc从关系数据库中取数据。功能很强大。

     b、还一个需要思考的问题是数据类型怎么映射啊?我们知道当我们从一个数据库表中读入数据时,我们定义的表结构的字段的类型和编程语言比如Scala中的数据类型映射关系是怎样的一种映射关系?在sparkSQL中有一种来解决这个问题的方法,来实现数据表中的字段类型到编程语言数据类型的映射关系。这个以后详细介绍,先了解有这个问题就行。

     c、数据有了,那么在sparkSQL中我们应该怎么组织这些数据,需要什么样的数据结构呢,同时我们对这些数据都可以进行什么样的操作?sparkSQL采用的是DataFrame数据结构来组织读入到sparkSQL中的数据,DataFrame数据结构其实和数据库的表结构差不多,数据是按照行来进行存储,同是还有一个schema,就相当于数据库的表结构,记录着每一行数据属于哪个字段。

     d、当数据处理完以后,我们需要把数据放入到什么地方,并切以什么样的格式进行对应,这个a和b要解决的问题是相同的。

2、sparkSQL对于以上问题的实现逻辑也很明确,从上图已经很清楚,主要分为两个阶段,每个阶段都对应一个具体的类来实现。

   a、 对于第一个阶段,sparkSQL中存在两个类来解决这些问题:HiveContext,SQLContext,同时hiveContext继承了SQLContext的所有方法,同时又对其进行了扩展。因为我们知道, hive和Mysql的查询还是有一定的差别的。HiveContext只是用来处理从hive数据仓库中读入数据的操作,SQLContext可以处理sparkSQL能够支持的剩下的所有的数据源。这两个类处理的粒度是限制在对数据的读写上,同时对表级别的操作上,比如,读入数据、缓存表、释放缓存表表、注册表、删除注册的表、返回表的结构等的操作。

  b、sparkSQL处理读入的数据,采用的是DataFrame中提供的方法。因为当我们把数据读入到sparkSQL中,这个数据就是DataFrame类型的。同时数据都是按照Row进行存储的。其中 DataFrame中提供了很多有用的方法。以后会细说。

 c、在spark1.6版本以后,又增加了一个类似于DataFrame的数据结构Dataset,增加此数据结构的目的是DataFrame有软肋,他只能处理按照Row进行存储的数据,并且只能使用DataFrame中提供的方法,我们只能使用一部分RDD提供的操作。实现Dataset的目的就是让我们能够像操作RDD一样来操作sparkSQL中的数据。

d、其中还有一些其他的类,但是现在在sparkSQL中最主要的就是上面的三个类,其他类以后碰到了会慢慢想清楚。

3、sparkSQL的hiveContext和SQLContext的运行原理

  hiveContext和SQLContext与我第一部分讲到的sql语句的模块解析实现的原理其实是一样的,采用了同样的逻辑过程,并且网上有好多讲这一块的,就直接粘贴复制啦!!

  sqlContext总的一个过程如下图所示:

1.SQL语句经过SqlParse解析成UnresolvedLogicalPlan;

2.使用analyzer结合数据数据字典(catalog)进行绑定,生成resolvedLogicalPlan;

3.使用optimizer对resolvedLogicalPlan进行优化,生成optimizedLogicalPlan;

4.使用SparkPlan将LogicalPlan转换成PhysicalPlan;

5.使用prepareForExecution()将PhysicalPlan转换成可执行物理计划;

6.使用execute()执行可执行物理计划;

7.生成SchemaRDD。

在整个运行过程中涉及到多个SparkSQL的组件,如SqlParse、analyzer、optimizer、SparkPlan等等

hiveContext总的一个过程如下图所示:

1.SQL语句经过HiveQl.parseSql解析成Unresolved LogicalPlan,在这个解析过程中对hiveql语句使用getAst()获取AST树,然后再进行解析;

2.使用analyzer结合数据hive、源数据Metastore(新的catalog)进行绑定,生成resolved LogicalPlan;

3.使用optimizer对resolved LogicalPlan进行优化,生成optimized LogicalPlan,优化前使用了ExtractpythonUdfs(catalog.PreInsertionCasts(catalog.CreateTables(analyzed)))进行预处理;

4.使用hivePlanner将LogicalPlan转换成PhysicalPlan;

5.使用prepareForExecution()将PhysicalPlan转换成可执行物理计划;

6.使用execute()执行可执行物理计划;

7.执行后,使用map(_.copy)将结果导入SchemaRDD。

到此这篇关于Spark SQL的整体实现逻辑的文章就介绍到这了,更多相关Spark SQL实现逻辑内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spark SQL的整体实现逻辑解析

本文链接: https://lsjlt.com/news/130285.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spark SQL的整体实现逻辑解析
    1、sql语句的模块解析    当我们写一个查询语句时,一般包含三个部分,select部分,from数据源部分,where限制条件部分,这三部...
    99+
    2024-04-02
  • mybatis动态sql实现逻辑代码详解
    目录1.xml文件读取2.xml 文件解析mybatis通过将sql配置xml文件中,通过解析xml动态标签来实现动态sql 如下样例 xml文件 <?xml ve...
    99+
    2024-04-02
  • MySQL逻辑体系架构的示例分析
    这篇文章主要为大家展示了“MySQL逻辑体系架构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL逻辑体系架构的示例分析”这篇文章吧。Mysql...
    99+
    2024-04-02
  • Python赋值逻辑的实现
    目录摘要:第一章 引例第二章 Python 的“反直觉”第三章 回答第一章的问题摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Pyt...
    99+
    2023-02-22
    Python赋值逻辑 Python赋值
  • 一文详解SQL 中的三值逻辑
    目录1. 前言2. 两种 Null3. 为什么是 is Null 而不是 = Null ?4. 第三个真值 “unknown”5. 包含三值逻辑的真值表6. “排中律” 不...
    99+
    2024-04-02
  • 一文详解SQL 中的三值逻辑
    目录1. 前言2. 两种 Null3. 为什么是 is Null 而不是 = Null ?4. 第三个真值 “unknown”5. 包含三值逻辑的真值表6. ...
    99+
    2024-04-02
  • 如何理解SQL Server数据体系和应用程序逻辑
    这篇文章给大家介绍如何理解SQL Server数据体系和应用程序逻辑,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  很多人都用过SQLServer数据库,但是很少的人真正理解SQLS...
    99+
    2024-04-02
  • PHP逻辑的核心原理解析
    PHP是一种广泛应用于网站开发的脚本语言,其逻辑处理能力是实现网站功能的关键。本文将深入探讨PHP逻辑的核心原理,包括变量、运算符、控制结构和函数等,同时提供具体的代码示例进行解析。 ...
    99+
    2024-03-06
    解析 核心原理 php逻辑
  • pytorch逻辑回归实现步骤详解
    目录1. 导入库2. 定义数据集2.1 生成数据2.2 设置label3. 搭建网络+优化器4. 训练5. 绘制决策边界6. 代码1. 导入库 机器学习的任务分为两大类:分类和回归 ...
    99+
    2024-04-02
  • 全面剖析PHP 数组底层实现逻辑
    前言最近在看《PHP 内核剖析》,关于 PHP 数组方面有所得,特此撰文一篇总结记录 (∩_∩)。因为 PHP 的数组是很强大且很重要的数据类型,它既支持单纯的数组又支持键值对数组,其中键值对数组类似于 Go  语言的 map 但...
    99+
    2024-02-29
    PHP 数组 实现逻辑 解析数组 后端 开源
  • Netty分布式FastThreadLocal的set方法实现逻辑剖析
    目录FastThreadLocal的set方法实现线程set对象我们跟到setIndexedVariable中我们跟进removeIndexedVariable方法上一小节我们学习了...
    99+
    2024-04-02
  • Netty分布式解码器读取数据不完整的逻辑剖析
    目录概述第一节: ByteToMessageDecoder我们看他的定义我们看其channelRead方法我们看cumulator属性我们回到channRead方法中概述 在我们上一...
    99+
    2024-04-02
  • JPA原生SQL分页查询逻辑的示例分析
    这篇文章将为大家详细讲解有关JPA原生SQL分页查询逻辑的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JPA原生SQL(自定义SQL)分页查询JPA自己写SQL查询的话,分页还稍微麻烦经过测试下...
    99+
    2023-06-21
  • PostgreSQL的逻辑复制怎么实现
    在 PostgreSQL 中,逻辑复制是通过订阅和发布的方式实现的。下面是实现逻辑复制的步骤: 创建发布者(publisher):...
    99+
    2024-04-02
  • PHP逻辑的实际应用场景分析
    PHP作为一种流行的服务器端脚本语言,主要用于开发Web应用程序。它具有灵活、简单易学的特点,因此在各种项目中得到了广泛应用。本文将从实际应用场景出发,分析PHP逻辑的使用,并提供具体...
    99+
    2024-03-06
    用户权限控制 表单提交 lsp
  • PostgreSQL中ExecHashJoin依赖其他函数的实现逻辑分析
    这篇文章主要介绍“PostgreSQL中ExecHashJoin依赖其他函数的实现逻辑分析”,在日常操作中,相信很多人在PostgreSQL中ExecHashJoin依赖其他函数的实现逻辑分析问题上存在疑惑...
    99+
    2024-04-02
  • Android程序锁的实现以及逻辑
    本项目是一个比较有趣的项目源码,可以给其他项目加锁,程序锁的原理是一个“看门狗”的服务定时监视顶层activity,如果activity对应的包名是之前上锁的应用程序的,则弹出...
    99+
    2022-06-06
    Android
  • PostgreSQL中create_plan的实现逻辑是什么
    本篇内容主要讲解“PostgreSQL中create_plan的实现逻辑是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中create_...
    99+
    2024-04-02
  • spring @Lazy延迟注入的逻辑实现
    目录前言一、一个简单的小例子二、源码解读1. 注入2. 使用逻辑总结前言 有时候我们会在属性注入的时候添加@Lazy注解实现延迟注入,今天咱们通过阅读源码来分析下原因 一、一个简单的...
    99+
    2024-04-02
  • R语言逻辑型运算的实现
    目录一、逻辑型向量与比较运算二、逻辑运算三、逻辑运算函数一、逻辑型向量与比较运算         逻辑...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作