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;
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
表格存储 Tablestore SQL 商业版介绍
表格存储(Tablestore)是阿里云自研的多模型结构化数据存储,提供海量结构化数据存储以及快速的查询和分析服务。表格存储的分布式存储和强大的索引引擎能够支持 PB 级存储、千万 TPS 以及毫秒级延迟的服务能力。使用表格存储你可以方便的存储和查询你的海量数据。
表格存储在 21 年 9 月正式公测了 SQL 功能,使得你在享受表格存储全托管,灵活的存储能力之外,可以让你的业务迁移更加平顺。经
表格存储 Tablestore 简介
近十年来互联网技术得到了飞速的发展,越来越多的行业逐渐加入到了互联网的阵营中来,同时也产生了更丰富、更复杂的业务场景和需求,这对于数据应用系统的性能无疑是巨大的挑战。传统关系型数据库有什么瓶颈,如何通过分布式数据库表格存储 Tablestore 进行优化?
Tablestore 与 Elasticsearch 在数据库查询加速场景使用对比
过去三十年,我们从企业应用开始,经历了 PC 互联网、移动互联网的爆发式发展,到如今的产业互联网。在这些不同时代,一直变化的是应用形态,不变的是核心数据的价值。对于核心数据的存储,首选的方案是使用数据库存储,从互联网初期开始,开源关系型数据库 MySQL 成长成为了数据库存储的第一选择,关系型数据库解决了数据的快速建模,高可靠存储和快速查询,但是关系数据库中的高效查询主要依赖二级索引,如果出现索引
表格存储 SQL 查询多元索引
多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能。表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格中读取数据,非主键列上的查询需要扫描全表。
使用 Blink 访问表格存储 Tablestore
本文介绍如何使用实时计算 Blink 服务访问表格存储服务(Tablestore),并进行开发。背景Blink 产品介绍阿里云实时计算Flink版(Alibaba Cloud Realtime Compute for Apache Flink,Powered by Ververica)是阿里云基于Apache Flink构建的企业级、高性能实时大数据处理系统,由Apache Flink创始团队官方
表格存储Tablestore作为大数据存储服务,提供了多种数据输出接口,主要包含: 单行读(GetRow)、 批量读(BatchGetRow)、 范围读(GetRange)、多元索引检索(Search)以及通道服务的数据订阅(Tunnel Service)。