表格存储的宽行流式读功能

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介:

本篇文章介绍表格存储中的宽行流式读功能,简单说就是介绍如何读取一个列很多数据量很大的行,当一次读取不出整行时如何分多次读取,当只需要读取宽行的一部分时如何读取可以性能更好。

宽行与宽行流式读

表格存储的表结构设计中,每行由主键列和属性列构成,主键列按照顺序构成一个主键,唯一的确定一行。读写某一行时,我们必须指定这一行的主键,然后写入或者读取其中的某些属性列。

主键列的名称和类型是在建表时确定好的,作为TableMeta的一部分。但是属性列的列名和数量却是不需要指定的,在实际写入某一行时可以任意设置写入的属性列的列名,只要符合一定的字符集限制。

那么一行总共的属性列数量有没有限制呢?每行的大小是否有限制呢?答案是不限制,因为表格存储从存储机制和读写接口上支持宽行,这也是相比传统数据库的很大优势。 宽行一般而言就是指拥有非常多列的行,这样一行就会很宽,而且一行总大小很大。比如我们反复对同一行写入一些新的列,最终就会产生一个很宽的行。因为每次我们只写入一小部分数据到一个宽行,所以写入性能不是问题,问题在于读取。假如一行数据很大,我们是一次读不出整行的。那么要读取整行怎么办,可以想到假如可以先读取这一行的一部分列,再接着读后面的列,分多次读取就好了。这就是宽行流式读功能(需要使用4.0.0以上版本Java SDK)。

宽行读取方式

下面具体来介绍一下宽行的几种读取方式。

1. 使用startColumn,endColumn读取一定范围的属性列。

在GetRow的参数中,可以通过startColumn和endColumn指定要查询的属性列的起始和终止范围(按照字典序比较),这样可以读取一个宽行中的一定列名范围的列。

      // 读一行
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);

    // 设置读取的列的范围
    criteria.setStartColumn("Col00000");
    criteria.setEndColumn("Col10000");

    // 设置读取最新版本
    criteria.setMaxVersions(1);
    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();

2. 使用ColumnPaginationFilter配合startColumn参数。

ColumnPaginationFilter有两个参数,limit和offset,使用ColumnPaginationFilter读取时,会跳过offset个属性列,然后读取limit个属性列。配合startColumn使用时,会从startColumn开始,跳过offset个属性列,读取limit个属性列。这种方式适合分页读取属性列的场景。

    // 读一行
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);

    // 设置从“ColumnX”开始读
    criteria.setStartColumn("ColumnX");

    // 使用ColumnPaginationFilter设置一次要读取的列数, limit=10, offset=0
    criteria.setFilter(new ColumnPaginationFilter(10, 0));

    // 设置读取最新版本
    criteria.setMaxVersions(1);
    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();

3. 使用WideColumnIterator

使用SDK提供的WideColumnIterator,可以通过迭代器的方式读取一行中的全部属性列,SDK内部会流式获取。

    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, primaryKey);
   
    // 设置读取最新版本
    criteria.setMaxVersions(1);
    
    WideColumnIterator wideColumnIterator = syncClient.createWideColumnIterator(new GetRowRequest(criteria));

    System.out.println(wideColumnIterator.getPrimaryKey());
    while (wideColumnIterator.hasNextColumn()) {
        System.out.println(wideColumnIterator.nextColumn());
    }

总结

表格存储支持自由的属性列名称与个数,支持宽行,给业务的表结构设计提供了很高的灵活性。当表中具有宽行时,通常的读取方式可能不能满足需求,此时可以选用上述的几种方式进行宽行的读取。此外,业务在设计表结构时,如果有宽行需求,也要综合评估是否可将宽行转成多个窄行存储,避免处理宽行读取问题。

相关实践学习
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
存储 SQL NoSQL
表格存储 SQL 功能快速上手
# 功能介绍 表格存储(Tablestore)是阿里云自研的多模型结构化数据存储,提供海量结构化数据存储以及快速的查询和分析服务。表格存储的分布式存储和强大的索引引擎能够支持 PB 级存储、千万 TPS 以及毫秒级延迟的服务能力。使用表格存储你可以方便的存储和查询你的海量数据。​ 表格存储正式发布了 SQL 功能,满足用户业务平滑迁移到表格存储并可以继续通过 SQL 方式访问表格存储,表格存储
1417 0
|
存储 自然语言处理 NoSQL
表格存储如何在控制台使用多元索引(SearchIndex)功能
# 背景: 多元索引(SearchIndex)是TableStore 2018年重点打造的核心能力,目的是为在线数据平台(TableStore)提供丰富的查询能力, 目前提供了多种索引能力,包括倒排索引、多维空间索引等。
2797 0
|
存储 NoSQL PHP
201604深圳云栖大会Workshop - 使用表格存储开发用户弹幕功能
使用表格存储开发用户弹幕功能 目标 使用表格存储(TableStore,原称OTS)实现视频直播的弹幕功能,通过TableStore存储弹幕,并在TableStore中检索最新弹幕实时显示到直播页面中。
4458 0
|
6月前
|
存储 索引
表格存储根据多元索引查询条件直接更新数据
表格存储是否可以根据多元索引查询条件直接更新数据?
60 3
|
SQL 存储 弹性计算
玩转Tablestore:使用Grafana快速展示时序数据
Grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,可以通过将采集的数据查询然后可视化的展示,实现报警通知;Grafana拥有丰富的数据源,官方支持以下数据源:Graphite,Elasticsearch,InfluxDB,Prometheus,Cloudwatch,MySQ
1643 0
|
1月前
|
分布式计算 DataWorks API
DataWorks常见问题之按指定条件物理删除OTS中的数据失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
3月前
|
DataWorks NoSQL 关系型数据库
可以使用dataworks从tablestore同步数据到mysql吗?
可以使用dataworks从tablestore同步数据到mysql吗?
29 1
|
10月前
|
NoSQL 开发工具
TableStore表格存储(阿里云OTS)多行数据操作查询,支持倒序,过滤条件和分页
1. 批量读取操作 批量读取操作可以通过多种方式进行,包括: GetRow:根据主键读取一行数据。 BatchGetRow:批量读取多行数据。 GetRange:根据范围读取多行数据。
560 0
|
存储 消息中间件 NoSQL
物联网数据通过规则引擎流转到OTS|学习笔记
快速学习物联网数据通过规则引擎流转到OTS
272 0
物联网数据通过规则引擎流转到OTS|学习笔记