迭代读取数据

本文介绍如何通过 Java SDK 迭代读取表格存储中的数据。

前提条件

初始化 Tablestore Client

方法说明

public Iterator<Row> createRangeIterator(RangeIteratorParameter rangeIteratorParameter) throws TableStoreException, ClientException

RangeIteratorParameter参数说明

名称

类型

说明

tableName(必选)

String

数据表名称。

inclusiveStartPrimaryKey(必选)

PrimaryKey

起始主键信息。

  • 返回数据包含起始主键。

  • 主键个数和类型必须与数据表的主键保持一致。

  • 正向读取数据时,起始主键必须小于结束主键。

  • 反向读取数据时,起始主键必须大于结束主键。

  • PrimaryKeyValue.INF_MIN 表示无限小,PrimaryKeyValue.INF_MAX 表示无限大。

exclusiveEndPrimaryKey(必选)

PrimaryKey

结束主键信息。

  • 返回数据不包含结束主键。

  • 主键个数和类型必须与数据表的主键保持一致。

  • PrimaryKeyValue.INF_MIN 表示无限小,PrimaryKeyValue.INF_MAX 表示无限大。

direction(可选)

Direction

读取方向。

  • FORWARD:默认值,正向读取数据。

  • BACKWARD:反向读取数据。

maxVersions(可选)

OptionalValue<Integer>

最大版本数。

  • 必须设置最大版本数和版本范围的其中一个。

  • 如果符合查询条件的数据版本数量超过设置的最大版本数,按从新到旧的顺序返回指定版本数量的数据。

timeRange(可选)

OptionalValue<TimeRange>

数据版本范围。

  • 必须设置最大版本数和版本范围的其中一个。

  • 表格存储数据表的每个属性列可以有不同的数据版本,设置版本范围后,仅返回版本范围内的数据。

maxCount(可选)

int

最大迭代读取行数,必须大于 0。

bufferSize(可选)

int

缓冲大小,必须大于 0。如果符合查询条件的数据行数大于设置的值,单次查询返回指定的缓冲行数和下一次查询的起始主键值。

columnsToGet(可选)

Set<String>

指定读取的数据列,可以是主键列或属性列。

  • 不设置columnsToGet时,返回整行数据。

  • 设置columnsToGet时,如果读取的行数据不包含任何指定的数据列,不返回该行数据。

filter(可选)

OptionalValue<Filter>

过滤条件,详情请参见过滤器

  • 如果同时设置columnsToGetfilter,先按columnsToGet筛选符合条件的数据行,再按filter条件过滤数据。

示例代码

以下示例代码使用迭代方式读取 test_table 表中从主键值 row1 开始的数据。

public static void createRangeIteratorExample(SyncClient client) {
    // 构造迭代查询条件
    RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter("test_table");
    // 设置迭代查询起始主键
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
    // 设置迭代查询结束主键,返回结果不包含结束主键
    primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
    rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
    // 设置查询版本
    rangeIteratorParameter.setMaxVersions(1);

    // 调用 createRangeIterator 获取迭代器
    Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
    while(iterator.hasNext()) {
        Row row = iterator.next();
        System.out.println(row);
    }
}

您可以在迭代读取数据时参考以下示例代码进行参数设置。

  • 设置数据读取方向。

    // 设置反向读取数据
    rangeIteratorParameter.setDirection(Direction.BACKWARD);
    // 设置迭代查询起始主键,反向读取数据时,起始主键要大于结束主键
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
    rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
    // 设置迭代查询结束主键,返回结果不包含结束主键
    primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
  • 设置读取的数据版本范围,结果只返回版本范围内的数据。

    // 设置查询的数据版本范围为当前时间往前一天
    rangeIteratorParameter.setTimeRange(new TimeRange(System.currentTimeMillis() - 86400*1000, System.currentTimeMillis()));
  • 设置最大迭代读取行数。

    rangeIteratorParameter.setMaxCount(20);
  • 设置缓冲大小。

    rangeIteratorParameter.setBufferSize(5);
  • 指定读取的属性列。

    rangeIteratorParameter.addColumnsToGet("col2");

相关文档