天天看点

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

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

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

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

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

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

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

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

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

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