sparksql 中外连接查询中的谓词下推规则

sparksql 中外连接查询中的谓词下推规则

ID:19219914

大小:166.65 KB

页数:12页

时间:2018-09-29

sparksql 中外连接查询中的谓词下推规则_第1页
sparksql 中外连接查询中的谓词下推规则_第2页
sparksql 中外连接查询中的谓词下推规则_第3页
sparksql 中外连接查询中的谓词下推规则_第4页
sparksql 中外连接查询中的谓词下推规则_第5页
资源描述:

《sparksql 中外连接查询中的谓词下推规则》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、SparkSql中外连接查询中的谓词下推规则SparkSqlSparkSql是架构在spark计算框架之上的分布式Sql引擎,使用DataFrame和DataSet承载结构化和半结构化数据来实现数据复杂查询处理,提供的DSL可以直接使用scala语言完成sql查询,同时也使用thriftserver提供服务化的Sql查询功能。SparkSql提供了DataSourceAPI,用户通过这套API可以自己开发一套Connector,直接查询各类数据源,包括NoSql、RDBMS、搜索引擎以及HDFS等分布式FS上的文件等。和SparkSql类似的系统,从Sql和计算框架分离角度看应该就是Hiv

2、e;从面相的业务类型看有PrestoDB、Impala等(都可以在一定程度上应对即系查询)。谓词下推所谓谓词(predicate),英文定义是这样的:Apredicateisafunctionthatreturnsbool(orsomethingthatcanbeimplicitlyconvertedtobool),也就是返回值是true或者false的函数,使用过scala或者spark的同学都知道有个filter方法,这个高阶函数传入的参数就是一个返回true或者false的函数。如果是在sql语言中,没有方法,只有表达式,where后边的表达式起的作用正是过滤的作用,而这部分语句被s

3、ql层解析处理后,在数据库内部正是以谓词的形式呈现的。那么谓词为什么要下推呢?说白了,这个问题就是要回答到底谁来完成过滤数据的操作。那么谁都可以来完成数据过滤呢?我们大致可以把SparkSql中的查询处理流程做如下的划分: SparkSql首先会对输入的sql语句进行一系列的分析,包括词法解析(可以理解为搜索引擎中的分词这个过程)、语法分析以及语义分析(例如判断database或者table是否存在、groupby必须和聚合函数结合等规则);之后是执行计划的生成,包括逻辑计划和物理计划,其中在逻辑计划阶段会有很多的优化,而物理计划则是RDD的DAG图的生成;这两步完成之后则是具体的执行了(

4、也就是各种重量级的计算逻辑),这就会有各种物理操作符(RDD的Transformation)的乱入,和本文讨论的问题相关的则是Filter和Scan两个操作符。其中Scan操作符直接面向底层数据源,完成数据源的扫描读取;Filter操作符完成扫描后数据的过滤。我们知道,可以通过封装SparkSql的DataSourceAPI完成各类数据源的查询,那么如果底层数据源无法高效完成数据的过滤,就会执行直接的全局扫描,把每条相关的数据都交给SparkSql的Filter操作符完成过滤,虽然SparkSql使用的CodeGeneration技术极大的提高了数据过滤的效率,但是这个过程无法避免大量数据

5、的磁盘读取,甚至在某些情况下会涉及网络IO(例如数据非本地化时);如果底层数据源在进行扫描时能非常快速的完成数据的过滤,那么就会把过滤交给底层数据源来完成,这就是SparkSql中的谓词下推(至于哪些数据源能高效完成数据的过滤以及SparkSql是又如何完成高效数据过滤的则不是本文讨论的重点)。外连接查询和连接条件外连接查询(outterjoin),分为左外连接查询、右外连接查询以及全外连接查询,全外连接使用的场景不多,所以本文重点讨论的是左连接查询和右连接查询。连接条件,则是指当这个条件满足时两表的两行数据才能”join“在一起被返回,例如有如下查询:1.SELECTLT.value, 

6、RT.value2.3.FROMlefttableLTLEFTJOINrighttableRT4.5.  ONLT.id = RT.idANDLT.id > 16.7.WHERERT.id > 21.其中的“LT.id=RT.idANDLT.id>1”这部分条件被称为“join中条件”,直接用来判断被join的两表的两行记录能否被join在一起,如果不满足这个条件,两表的这两行记录并非全部被踢出局,而是根据连接查询类型的不同有不同的处理,所以这并非一个单表的过滤过程或者两个表的的“联合过滤”过程;而where后的“RT.id>2”这部分被称为“join后条件”,就是一个单表过滤过程。而上边

7、提到的谓词下推能否在两类条件中使用,在SparkSql中则有特定的规则,以左外连接查询为例,规则如下:接下来对这个表格中的规则进行详细的分析。假设我们有两张表,表结构很简单,数据也都只有两条,但是足以讲清楚我们的下推规则,两表如下: lefttable: rigthtable: 左表join后条件下推查询语句如下:1.SELECTLT.id, LT.value, RT.value2.3.FROMlefttableLT4.

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。