使用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谓词全部下推
目录
相关文章
|
4月前
|
存储 分布式计算 运维
EMR Serverless Spark服务最佳实践测评
EMR Serverless Spark服务最佳实践测评
141 2
|
SQL 存储 运维
EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践
本文详细介绍了 EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践。
2278 1
EMR-StarRocks 与 Flink 在汇量实时写入场景的最佳实践
|
存储 SQL 分布式计算
百草味基于“ EMR+Databricks+DLF ”构建云上数据湖的最佳实践
本文介绍了百草味大数据平台从 IDC 自建 Hadoop 到阿里云数据湖架构的迁移方案和落地过程。重点从 IDC 自建集群的痛点分析,云上大数据方案的选型以及核心模块的建设过程几个方面做了详细的介绍,希望给想了解和实践数据湖架构的企业和朋友一个参考。
百草味基于“ EMR+Databricks+DLF ”构建云上数据湖的最佳实践
|
存储 SQL 弹性计算
EMR 弹性数据湖分析最佳实践
本最佳实践讲解了如何基于阿里云产品快速搭建一个企业级的离线日志大数据分析系统,这里以搭建一个电商网站用户访问行为日志分析系统为例。
EMR 弹性数据湖分析最佳实践
|
数据管理 关系型数据库 MySQL
湖仓一体架构EMR元数据迁移DLF最佳实践
通过EMR+DLF数据湖方案,可以为企业提供数据湖内的统一的元数据管理,统一的权限管理,支持多源数据入湖以及一站式数据探索的能力。本方案支持已有EMR集群元数据库使用RDS或内置MySQL数据库迁移DLF,通过统一的元数据管理,多种数据源入湖,搭建高效的数据湖解决方案。
湖仓一体架构EMR元数据迁移DLF最佳实践
|
存储 JSON 分布式计算
使用EMR DataFrame 批处理 Tablestore
使用Spark的DataFrame方式访问表格存储,并在本地和集群上分别进行运行调试。 ## 前提条件 - 了解Spark访问表格存储的依赖包,并在使用时通过maven方式引入项目中。 - Spark相关:spark-core、spark-sql、spark-hive - Spark Tablestore connector:emr-tablestore-.jar
323 0
使用EMR DataFrame 批处理 Tablestore
|
SQL 存储 分布式计算
使用EMR SQL 批处理Tablestore
通过在E-MapReduce集群中使用Spark SQL访问表格存储。对于批计算,Tablestore on Spark提供索引选择、分区裁剪、Projection列和Filter下推、动态指定分区大小等功能,利用表格存储的全局二级索引或者多元索引可以加速查询。 ## 前提条件 - 已创建E-MapReduce Hadoop集群。具体操作,请参见[创建集群](https://help.al
351 0
|
存储 分布式计算 容灾
阿里云 EMR最佳实践和容灾
阿里云EMR(Elastic MapReduce)最佳实践和容灾设计
4097 0
|
3月前
|
分布式计算 大数据 MaxCompute
EMR Remote Shuffle Service实践问题之阿里云RSS的开源计划内容如何解决
EMR Remote Shuffle Service实践问题之阿里云RSS的开源计划内容如何解决
|
3月前
|
分布式计算 测试技术 调度
EMR Remote Shuffle Service实践问题之集群中落地阿里云RSS如何解决
EMR Remote Shuffle Service实践问题之集群中落地阿里云RSS如何解决
下一篇
无影云桌面