使用EMR 批处理的最佳实践-谓词下推

简介: 批计算中的多元索引查询方式可以自定义谓词下推配置。目前只能设置与Long、String类型的列做大小比较的谓词是否下推。 ## 背景信息 谓词下推适用于当多元索引中多字段过滤的中间结果数据量较大,则中间结果的合并较为耗时的场景。此时可以将某些字段的过滤从存储层(表格存储)提到计算层(Spark)处理,提高查询效率。 例如`select * from table where a =

批计算中的多元索引查询方式可以自定义谓词下推配置。目前只能设置与Long、String类型的列做大小比较的谓词是否下推。

背景信息

谓词下推适用于当多元索引中多字段过滤的中间结果数据量较大,则中间结果的合并较为耗时的场景。此时可以将某些字段的过滤从存储层(表格存储)提到计算层(Spark)处理,提高查询效率。

例如select * from table where a = 10 and b < 999999999;,如果a = 10返回的结果只有1000条,b < 999999999返回的结果有一亿条,则在存储层将1000条结果与一亿条结果做合并比较耗时,此时把b < 999999999提到计算层,Spark只需要对存储层返回的1000条数据作过滤,大大降低了存储层的压力。

谓词支持

Spark谓词支持情况请参见下表。

Spark 是否支持 SQL举例
And select * from table where a > 1 and b < 0 
Or select * from table where a > 1 or b < 0
Not select * from table where a != 1
EqualTo select * from table where a = 1
Not+EqualTo select * from table where a != 1
IsNull select * from table where a is null table表中没有a列的行
In select * from table where a in {1,2,3} 默认最大限制1024
LessThan select * from table where a < 10 如果SQL语句中使用该谓词的列的类型为Long或者String,则可以通过谓词下推配置设置是否下推,详情见下一节"谓词下推支持说明"
LessThanOrEqual select * from table where a <=10 如果SQL语句中使用该谓词的列的类型为Long或者String,则可以通过谓词下推配置设置是否下推,详情见下一节"谓词下推支持说明"
GreaterThan select * from table where a > 10 如果SQL语句中使用该谓词的列的类型为Long或者String,则可以通过谓词下推配置设置是否下推,详情见下一节"谓词下推支持说明"
GreaterThanOrEqual select * from table where a >= 10 如果SQL语句中使用该谓词的列的类型为Long或者String,则可以通过谓词下推配置设置是否下推,详情见下一节"谓词下推支持说明"
StringStartsWith select * from table where a like "tablestore%" table表中a列以tablestore为prefix的行全部返回
地理坐标(String Json)中心距离 select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}' 圆心半径决定的地理圆圈
地理坐标(String Json)矩形框 select * from table where geo = '{"topLeft":"8,0", "bottomRight": "0,10"}' 左上角,右下角决定的地理矩形
地理坐标(String Json)多边形框 select * from table where geo = '{"points":["5,0", "5,1", "6,1", "6,10"]}' 多个点组成的地理多边形

谓词下推配置

谓词下推配置的参数需要在创建Spark外表时配置。谓词下推规则如下:

  • 当过滤条件中的逻辑谓词只存在AND和NOT时,可以自定义谓词是否下推。
  • 当过滤条件中的逻辑谓词存在OR时,谓词全部下推,自定义的谓词下推配置(例如E-MapReduce SQL方式的参数配置push.down.range.long=false和push.down.range.string=false)不会生效。

不同的逻辑谓词和下推配置组合使用时,SQL语句举例及预期效果请参见下表。

逻辑谓词 下推配置 SQL举例 预期效果
全为AND push.down.range.long=true push.down.range.string=true select * from table where val_long1 > 1000 and val_long1 is null and name like 'table%' and pk in {12341,213432} SQL正常
全为AND push.down.range.long=false select * from table where val_long1 > 1 and name like 'table%' 与Long类型做大小比较的谓词(LessThan LessThanOrEqual GreaterThan GreaterThanOrEqual)都不会被下推,该谓词交由Spark层来做过滤 spark层获取到的是name like 'table%'的数据,val_long1 > 1交由spark过滤
全为AND push.down.range.string=false select * from table where val_string1 > 'string1' and name like 'table%' 与String类型做大小比较的谓词(LessThan LessThanOrEqual GreaterThan GreaterThanOrEqual)都不会被下推,该谓词交由Spark层来做过滤 spark层获取到的是name like 'table%'的数据,val_string1 > 'string1'交由spark过滤
全为AND 存在地理列 select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}' and val_long1 = 37691900 and val_long2 > 2134234 SQL正常val_long2 > 2134234能否被过滤则取决于push.down.range.long的配置
存在OR long,string都配置为可以下推push.down.range.long=true push.down.range.string=true select * from table where val_long1 > 1000 or val_long1 is null or name like 'table%' and pk in {12341,213432} SQL正常
存在OR 存在地理列 select * from table where val_geo = '{"centerPoint":"3,0", "distanceInMeter": 100000}' or val_long1 = 37691900 SQL正常
存在OR push.down.range.long=false 且SQL语句中存在rangeLong 的过滤字段 select * from table where val_long1 > 1 and name like 'table%' 此时push.down.range.long=false不生效,SQL谓词全部下推
存在OR push.down.range.string=false 且SQL语句中存在rangeString 的过滤字段 select * from table where val_string1 > 'string1' and name like 'table%' 此时push.down.range.string=false不生效,SQL谓词全部下推
目录
相关文章
|
存储 SQL 弹性计算
EMR 弹性数据湖分析最佳实践
本最佳实践讲解了如何基于阿里云产品快速搭建一个企业级的离线日志大数据分析系统,这里以搭建一个电商网站用户访问行为日志分析系统为例。
EMR 弹性数据湖分析最佳实践
|
数据管理 关系型数据库 MySQL
湖仓一体架构EMR元数据迁移DLF最佳实践
通过EMR+DLF数据湖方案,可以为企业提供数据湖内的统一的元数据管理,统一的权限管理,支持多源数据入湖以及一站式数据探索的能力。本方案支持已有EMR集群元数据库使用RDS或内置MySQL数据库迁移DLF,通过统一的元数据管理,多种数据源入湖,搭建高效的数据湖解决方案。
湖仓一体架构EMR元数据迁移DLF最佳实践
|
SQL 存储 分布式计算
使用EMR SQL 批处理Tablestore
通过在E-MapReduce集群中使用Spark SQL访问表格存储。对于批计算,Tablestore on Spark提供索引选择、分区裁剪、Projection列和Filter下推、动态指定分区大小等功能,利用表格存储的全局二级索引或者多元索引可以加速查询。 ## 前提条件 - 已创建E-MapReduce Hadoop集群。具体操作,请参见[创建集群](https://help.al
326 0
|
存储 JSON 分布式计算
使用EMR DataFrame 批处理 Tablestore
使用Spark的DataFrame方式访问表格存储,并在本地和集群上分别进行运行调试。 ## 前提条件 - 了解Spark访问表格存储的依赖包,并在使用时通过maven方式引入项目中。 - Spark相关:spark-core、spark-sql、spark-hive - Spark Tablestore connector:emr-tablestore-.jar
288 0
使用EMR DataFrame 批处理 Tablestore
|
存储 分布式计算 容灾
阿里云 EMR最佳实践和容灾
阿里云EMR(Elastic MapReduce)最佳实践和容灾设计
3925 0
|
5月前
|
关系型数据库 MySQL BI
用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓实战分享
本文从用友畅捷通公司介绍及业务背景;数据仓库技术选型、实际案例及未来规划等方面,分享了用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓的实战经验。
607 0
用友畅捷通基于阿里云 EMR StarRocks 搭建实时湖仓实战分享
|
9月前
|
存储 SQL 分布式计算
阿里云全托管flink-vvp平台hudi connector实践(基于emr集群oss-hdfs存储)
阿里云全托管flink-vvp平台hudi sink connector实践,本文数据湖hudi基于阿里云E-MapReduce产品,以云对象存储oss-hdfs作为存储
|
12月前
|
SQL 存储 监控
水滴筹基于阿里云 EMR StarRocks 实战分享
水滴筹大数据部门的数据开发工程师韩园园老师为大家分享水滴筹基于阿里云EMR StarRocks的实战经验。
5795 3
水滴筹基于阿里云 EMR StarRocks 实战分享
|
SQL 存储 弹性计算
阿里云EMR 2.0:重新定义新一代开源大数据平台
本次分享主要介绍了阿里云E-MapReduce的开发历程,EMR 2.0的新特性、产品架构,以及EMR 2.0在平台体验、数据开发、资源形态及分析场景等方面的全面突破与创新,重新定义新一代开源大数据平台。
2153 0
阿里云EMR 2.0:重新定义新一代开源大数据平台
|
4月前
|
存储 分布式计算 Apache
阿里云 EMR 基于 Paimon 和 Hudi 构建 Streaming Lakehouse
Apache Paimon 和 Apache Hudi 作为数据湖存储格式,有着高吞吐的写入和低延迟的查询性能,是构建数据湖的常用组件。本文在阿里云EMR上,针对数据实时入湖场景,对 Paimon 和 Hudi 的性能进行比对,并分别以 Paimon 和 Hudi 作为统一存储搭建准实时数仓。
64628 1
阿里云 EMR 基于 Paimon 和 Hudi 构建 Streaming Lakehouse