984
技术社区[云栖]
宽行读取__最佳实践_表格存储-阿里云
本节介绍表格存储中的宽行流式读功能,即如何读取一个有很多列和很大数据量的行、当一次读取不出整行时如何分多次读取或者当只需要读取宽行的一部分时如何读取性能可以更好。
宽行与宽行流式读
表格存储的表每行由主键列和属性列构成,主键列按照顺序构成一个主键,是可以确定行的唯一标识。读/写某一行时,我们必须指定这一行的主键,然后写入或者读取其中的某些属性列。
主键列的名称和类型是在建表时确定好的,为 TableMeta 的一部分。但是属性列的列名和数量却是不需要指定的,在实际写入某一行时可以任意设置写入的属性列的列名,只要符合一定的字符集限制即可。
表格存储从存储机制和读/写接口上支持宽行,所以不会限制总共的属性列数量和每行的大小,这也是相比传统数据库的很大优势。宽行一般而言就是指拥有非常多列的行,这样一行就会很宽,而且一行总大小很大。比如,反复对同一行写入一些新的列,最终就会产生一个很宽的行。因为每次只写入一小部分数据到一个宽行,所以写入性能不是问题,问题在于读取。假如一行数据很大,一次无法读出整行。若要读取整行,可以先读取这一行的一部分列,再接着读后面的列,分多次读取就可以,这就是宽行流式读功能(需要使用 4.0.0 以上版本 Java SDK)。
宽行读取方式
宽行读取有以下几种方式:
使用 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();
使用 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();
使用 WideColumnIterator。
使用 SDK 提供的 WideColumnIterator,可以通过迭代器的方式读取一行中的全部属性列。
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());
}
总结
表格存储支持自由的属性列名称与个数,支持宽行,给业务的表结构设计提供了很高的灵活性。当表中具有宽行时,通常的读取方式可能不能满足需求,此时可以选用上述的几种方式进行宽行的读取。此外,业务在设计表结构时,如果有宽行需求,也要综合评估是否可将宽行转成多个窄行存储,避免处理宽行读取问题。
最后更新:2016-12-12 17:07:43
上一篇:
使用过滤器__最佳实践_表格存储-阿里云
下一篇:
主键列自增__最佳实践_表格存储-阿里云
类型转换__进阶与深入_数据集成-阿里云
请求接口__调用方式_API参考_专有网络 VPC-阿里云
sleep示例__示例程序_MapReduce_大数据计算服务-阿里云
代金券账户消费后是否可以开发票?___代金券_代金券及推荐码_财务-阿里云
断点续传上传__上传文件_开发人员指南_对象存储 OSS-阿里云
HeadObject__关于Object操作_API 参考_对象存储 OSS-阿里云
更换系统盘__磁盘_用户指南_云服务器 ECS-阿里云
步骤4:修改DNS解析(可选)__快速入门(非网站业务)_DDoS 高防IP-阿里云
PostVodPlaylist__关于LiveChannel的操作_API 参考_对象存储 OSS-阿里云
ALIYUN::SLB::VServerGroup__资源列表_资源编排-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云