Tablestore入门指南-GetRange范围查询详解

本文涉及的产品
表格存储 Tablestore,50G 2个月
简介: # 查询接口 表格存储Tablestore作为大数据存储服务,提供了多种数据输出接口,主要包含: 单行读(GetRow)、 批量读(BatchGetRow)、 范围读(GetRange)、多元索引检索(Search)以及通道服务的数据订阅(Tunnel Service)。本文将详细讲述范围读的功能、使用与限制。 ### ## 功能说明 GetRange接口提供了Table

查询接口

表格存储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有序排列,主表是一个特殊的基于主键的联合索引。因此,数据范围查询遵循联合索引的最左匹配原则。即:范围查询时如果某一列提供了具体的范围值(非单值),则下一列的范围限制约束是无效的。具体参考下图:

image.png

上例中,第一列主键的起止不同,导致第二列的限制未能生效,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

image.png

相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
索引 存储 NoSQL
表格存储(Tablestore)入门指南
表格存储(Tablestore)入门指南内容简介了表格存储(Tablestore)是阿里云自研的 NoSQL 多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务。
19991 2
|
存储 消息中间件 NoSQL
亿级消息系统的核心存储:Tablestore发布Timeline 2.0模型
互联网快速发展的今天,社交类应用、消息类功能大行其道,占据了大量网络流量。大至钉钉、微信、微博、知乎,小至各类App的推送通知,消息类功能几乎成为所有应用的标配。根据场景特点,我们可以将消息类场景归纳成三大类:IM(钉钉、微信)、Feed流(微博、知乎)以及常规消息队列。
16929 0
|
NoSQL 开发工具
TableStore表格存储(阿里云OTS)多行数据操作查询,支持倒序,过滤条件和分页
1. 批量读取操作 批量读取操作可以通过多种方式进行,包括: GetRow:根据主键读取一行数据。 BatchGetRow:批量读取多行数据。 GetRange:根据范围读取多行数据。
1316 0
|
存储 SQL 运维
基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇
背景订单系统存在于各行各业,如电商订单、银行流水、运营商话费账单等,是一个非常广泛、通用的系统。对于这类系统,在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大,数据的重视程度与数据规模的膨胀带来了新的挑战。首先,订单量对于数据的存储、持久化、访问带来了挑战,这不仅增加了开发面对的困难,也为系统的运维带来了挑战。其次,随着大数据技
3351 0
基于 MySQL + Tablestore 分层存储架构的大规模订单系统实践-架构篇
|
存储 SQL 自然语言处理
详解TableStore模糊查询——以订单场景为例
# 背景 订单系统在各行各业中广泛应用,为消费者、商家后台、促销系统等第三方提供用户、产品、订单等多维度的管理和查询服务。为了挖掘出海量订单数据的潜能,丰富高效的查询必不可少。然而很多时候并不能给出完整准确的查询关键字,例如,只知道收货人姓氏,或是产品名称部分关键字,或是根据收货人手机尾号找到订单,我们将这类查询归为“模糊查询”。
5742 0
|
索引 存储 NoSQL
海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解
前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍,也发布了很多场景案例文章,这些文章收录在这个合集中《表格存储Tablestore权威指南》。
26015 1
|
存储 NoSQL 索引
深入浅出TableStore翻页
表格存储是阿里云提供的一个分布式存储系统,可以用来存储海量结构化、半结构化的数据。数据存储后就需要查询出来满足业务需求,但是有时候一次请求可以返回的数据量有限,不能返回完所有的数据,那这个时候就需要通过多次查询来返回需要的数据,这就是我们接下来要讲的“翻页”。
4289 0
|
存储 NoSQL 分布式数据库
深入对比 HBase 与阿里云的表格存储服务
谷歌的 Bigtable 于 2016 年推出了兼容 HBase 的接口,而作为国内最早推出分布式 NoSQL 数据存储服务的阿里云表格存储也在最近正式发布了HBase Client,能够帮助用户将业务轻松从 HBase 迁移至表格存储。
21491 1
深入对比 HBase 与阿里云的表格存储服务
|
存储 运维 Cloud Native
教你如何免费使用一款免运维、无限容量的表存储服务
作者:李欣前言表格存储是一款用于存储海量非关系型(NoSQL)结构化数据的云原生表存储服务,提供 Schemaless 表结构设计、多元化索引以及数据更新实时订阅通道,支撑 PB 级数据存储的同时能提供丰富且灵活的数据查询、检索和分析能力。对接了各大主流开源计算引擎,能灵活的实现流批一体分析。通过阅读本文您将了解如何免费开通和使用表格存储服务,即刻拥有一个完全免运维、弹性、高性能、低成本的表存储服
3957 0
教你如何免费使用一款免运维、无限容量的表存储服务
|
存储 NoSQL 关系型数据库
基于Tablestore打造亿量级订单管理解决方案
一、方案背景 订单系统存在于各行各业,如电商订单、银行流水、运营商话费账单等,是一个非常广泛、通用的系统。对于这类系统,在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大。
19266 0