Tablestore入门指南-GetRange范围查询详解
查询接口
表格存储Tablestore作为大数据存储服务,提供了多种数据输出接口,主要包含: 单行读(GetRow)、 批量读(BatchGetRow)、 范围读(GetRange)、多元索引检索(Search)以及通道服务的数据订阅(Tunnel Service)。本文将详细讲述范围读的功能、使用与限制。
功能说明
GetRange接口提供了Tablestore数据的范围读取能力。通过接口,范围内数据将会按照指定的顺序(正序或逆序)逐页返回。用户需要提供范围的起始、终止的主键,来限定数据的范围。若总数据未能一个请求完整返回,可以通过连续翻页的方式,持续遍历下一页,知道获取完整结果。
限制条件
一次返回数据的行数超过 5000 行,或者返回数据的数据大小大于 4 MB。满足以上任一条件时,超出上限的数据将会按行级别被截掉并返回下一行数据主键信息。
API定义
message GetRangeRequest { required string table_name = 1; // 表名 required Direction direction = 2; // 返回顺序 repeated string columns_to_get = 3; // 返回列参数 optional TimeRange time_range = 4; // 返回列版本号范围 optional int32 max_versions = 5; // 返回列版本个数 optional int32 limit = 6; // 单次请求返回行数限制 required bytes inclusive_start_primary_key = 7; // 范围请求起始主键 required bytes exclusive_end_primary_key = 8; // 范围请求结束主键 optional bytes filter = 10; // 条件过滤 optional string start_column = 11; // 返回属性列列名起始 optional string end_column = 12; // 返回属性列列名结束 optional bytes token = 13; // 已废弃 optional string transaction_id = 14; // 事务ID } message GetRangeResponse { required ConsumedCapacity consumed = 1; // Cu消耗统计 required bytes rows = 2; // 返回的行数据结果 optional bytes next_start_primary_key = 3; // 翻页标识,下一页起始主键 optional bytes next_token = 4; // 已废弃 }
参数说明
table_name
表名,范围读接口仅对一张表做请求;
direction
方向或顺序,范围读正序(主键由小到大)、倒序(主键由大到小)返回,默认设置正序。
columns_to_get
返回列名,返回列的字段,支持全部列返回。若指定列名但列不存在,整行数据不返回(不代表行不存在)。
time_range
版本号范围,属性值版本号返回范围。
max_versions
版本号最大个数,属性值版本返回最大个数。
limit
单次请求行数限制,如果存在条件过滤或行数据较大,实际返回行数可能小于参数,不代表后面没有数据。要通过response中next_start_primary_key是否为空判断。
范围设置
边界起、止都是完整的主键,代表特定的范围位置。倒序时,起始主键需要大于结束主键。范围包含如下两个参数:
- inclusive_start_primary_key:主键起始值(包含边界);
- exclusive_end_primary_key:主键结束值(不包含边界);
filter
条件过滤器,可以提供列值的条件过滤筛选。支持列值的大于、小于、等于比较,以及多列字段的与或非混合条件。
宽行读
指定列名范围的读取参数,字段按字符串序排列,基于范围范围范围内属性列。包含如下两个参数:
- start_column:属性列的其实字段;
- end_column:属性列的终止字段;
transaction_id
事务ID,支持事务读。范围查询请求是针对一个表的请求,如果数据范围限制在一个分区键内,可以提供事务查询能力。
功能与示例
最左匹配
表中数据存储基于PrimaryKey有序排列,主表是一个特殊的基于主键的联合索引。因此,数据范围查询遵循联合索引的最左匹配原则。即:范围查询时如果某一列提供了具体的范围值(非单值),则下一列的范围限制约束是无效的。具体参考下图:
上例中,第一列主键的起止不同,导致第二列的限制未能生效,pk2=4的行也会出现在结果中。只有当前一列的起始、终止参数一样时,该列的起止限制条件才有效。如果用户需要查询pk2有限制范围的所有行,应当考虑创建二级索引,将pk2作为索引的第一列主键。
连续翻页
当范围条件数据单次请求未拿到全量数据时,需要用户基于NextStartPrimaryKey做连续翻页,从而遍历全部命中数据。如果GetRangeResponse.getNextStartPrimaryKey()非空,则一定还有数据。通过将获取的PrimaryKey设置到原请求中重新构建,然后再次发起请求。
- 注意:不可以通过行数等于零来判断翻页结束。
PrimaryKey nextStartPrimaryKey = null; do { GetRangeResponse getRangeResponse = syncClient.getRange(getRangeRequest); List<Row> pageRowList = getRangeResponse.getRows(); // 判断存在下一页,重构请求 nextStartPrimaryKey = getRangeResponse.getNextStartPrimaryKey(); if (nextStartPrimaryKey != null) { // 判断存在下一页,重构请求 criteria.setInclusiveStartPrimaryKey(nextStartPrimaryKey); getRangeRequest.setRangeRowQueryCriteria(criteria); } } while (nextStartPrimaryKey != null); // 持续翻页,直到没有下一页
迭代器
为了方便用户遍历全量数据,我们提供了迭代器接口。用户无需关心请求构建、结果判断等逻辑,只需将异步Client与请求体作为参数构建GetRangeIterator即可。迭代器内部自动发起请求,消费完一页数据后会自动发起下一页请求;
AsyncClient asyncClient = (AsyncClient) syncClient.asAsyncClient(); GetRangeIterator getRangeIterator = new GetRangeIterator(asyncClient, getRangeRequest); while (getRangeIterator.hasNext()) { Row row = getRangeIterator.next(); }
过滤器
表格存储过滤器的过滤条件支持算术运算(=、!=、>、>=、<、<=)和逻辑运算(NOT、AND、OR),支持最多 10 个条件的组合。通过条件组合,限制列(含主键)属性取值的约束。Limit限制的是过滤前的结果个数,经过过滤后实际返回的结果可能小于limit甚至没有数据。
SingleColumnValueFilter
单列的条件过滤参数。示例:Col0 == 0
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0)); // 如果不存在 Col0 这一列, 也不返回。
CompositeColumnValueFilter
组合多个算术运算符号达到多条件组合过滤的效果。示例:Col0 == 0 and Col1 >= 100
CompositeColumnValueFilter composite1 = new CompositeColumnValueFilter(CompositeColumnValueFilter.LogicOperator.AND); SingleColumnValueFilter single1 = new SingleColumnValueFilter("Col0", SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0)); SingleColumnValueFilter single2 = new SingleColumnValueFilter("Col1", SingleColumnValueFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)); composite1.addFilter(single1); composite1.addFilter(single2);
PassIfMissing
另外由于稀疏列的属性,部分行的属性列可能不存在,此时可以使用PassIfMissing参数来设置期望的过滤形式。
- True:代表如果这一列不存在也返回;
- False:代表这一列不存在就不返回。
示例:列不存在时不返回
singleColumnValueFilter.setPassIfMissing(false);
表格存储使用手册
本文结合Java SDK的接口调用代码,介绍了Tablestore在数据管理方面的基本功能与使用方式。代码已开源在Tablestore-Examples项目中,用户可以直接运行使用。基于样例代码与文章,新用户能更简单、更快速地上手Tablestore,欢迎新、老用户使用与建议。
通过对基础使用功能的持续输出,我们将整理出一套完整的使用手册(含可执行样例),敬请期待。
专家服务
如有疑问或者需要更好的在线支持,欢迎加入钉钉群:“表格存储公开交流群”。群内提供免费的在线专家服务,欢迎扫码加入,群号:23307953
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
手淘架构组最新实践 | iOS基于静态库插桩的⼆进制重排启动优化
作者|谢俊逸(极目) 出品|阿里巴巴新零售淘系技术部本文知识点提炼:1、APP 启动时 PageFault 的性能分析 2、静态库插桩重排方案的技术原理 背景 近期抖音和Facebook分享了自己通过二进制重排优化启动时间的方案,手淘iOS架构团队也对二进制重排进行了研究,由于手淘工程模块已经二进制化,因此实现了一套基于静态库插桩的重排方案。 APP 启动 和 PageFault 当我们向操作系统申请内存时,操作系统并不是直接分配给我们物理内存,而是只标记当前进程拥有该段内存,当真正使用这段段内存时才会分配。这种延迟分配物理内存的方式就通过page fault机制来实现的。当我们访问一个内存地址时,如果该地址非法,或者我们对其没有访问权限,或者该地址对应的物理内存还未分配,cpu都会生成一个page fault,进而执行操作系统的page fault handler。如果是因为还未分配物理内存,操作系统会立即分配物理内存给当前进程,然后重试产生这个page fault的内存访问指令。 App在启动时,需要执行各种函数,我们需要读取TEXT段代码到物理内存中,这个过程会发生缺⻚中断,由于...
- 下一篇
阿里云日志服务字段包含固定字符告警配置示例
概述 日志服务支持根据仪表盘中的查询图表设置告警,实现实时的服务状态监控。日志服务的告警功能基于仪表盘中的查询图表实现。在日志服务控制台查询页面或仪表盘页面设置告警规则,并指定告警规则的配置、检查条件和通知方式。本文以用户常见的需求:如果某个字段包含某一段固定字符“xxxx”,则告警。介绍整个告警过程的配置实现。 Step by Step 1、日志服务管理控制台创建project 和 logstore 2、配置索引 3、使用Java SDK写入日志,参考链接 import com.aliyun.openservices.log.Client; import com.aliyun.openservices.log.common.LogItem; import com.aliyun.openservices.log.exception.LogException; import com.aliyun.openservices.log.request.PutLogsRequest; import java.util.Date; import java.util.Vector; public c...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群