批量读取数据

本文介绍如何通过 Java SDK 批量读取表格存储中的数据,支持查询多个表的数据。

注意事项

单次批量读取操作最多支持读取 100 行数据。

前提条件

初始化 Tablestore Client

方法说明

public BatchGetRowResponse batchGetRow(BatchGetRowRequest batchGetRowRequest) throws TableStoreException, ClientException

BatchGetRowRequest参数说明

  • criteriasGroupByTable(必选)Map<String, MultiRowQueryCriteria>:批量读取数据信息。MultiRowQueryCriteria 包含以下参数。

    说明

    查询多个表的数据时,一个表对应一个 MultiRowQueryCriteria,MultiRowQueryCriteria内所有的数据行采用相同的查询条件。

    名称

    类型

    说明

    tableName(必选)

    String

    数据表名称。

    rowKeys(必选)

    List<PrimaryKey>

    主键列表。

    maxVersions(可选)

    OptionalValue<Integer>

    最大版本数。

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

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

    timeRange(可选)

    OptionalValue<TimeRange>

    数据版本范围。

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

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

    columnsToGet(可选)

    Set<String>

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

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

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

    filter(可选)

    OptionalValue<Filter>

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

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

示例代码

以下示例代码用于读取 test_table 表中主键值为 row1 和 row2 的两行数据。

public static void batchGetRowExample(SyncClient client) {
    // 构造查询条件
    MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria("test_table");
    // 添加第 1 行主键信息
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
    multiRowQueryCriteria.addRow(primaryKeyBuilder.build());
    // 添加第 2 行主键信息
    primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row2"));
    multiRowQueryCriteria.addRow(primaryKeyBuilder.build());
    // 设置查询版本
    multiRowQueryCriteria.setMaxVersions(1);

    // 调用 batchGetRow 方法进行批量数据查询
    BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
    batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
    BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);

    // 返回结果处理
    System.out.println("* RequestId: " + batchGetRowResponse.getRequestId());
    System.out.println("* Is all succeeded: " + batchGetRowResponse.isAllSucceed());
    // 打印读取成功的行
    System.out.println("* Succeeded Rows: ");
    for(BatchGetRowResponse.RowResult rowResult:batchGetRowResponse.getSucceedRows())
        System.out.println(rowResult.getRow());
    // 打印读取失败的行
    if(!batchGetRowResponse.isAllSucceed()) {
        System.out.println("* Failed Rows: ");
        for(BatchGetRowResponse.RowResult rowResult:batchGetRowResponse.getFailedRows())
            System.out.println(rowResult.getTableName() + " | " + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()) + " | " + rowResult.getError());
    }
}

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

  • 读取多张表的数据。批量读取支持一次读取多张表的数据,您需要为每张表指定一个MultiRowQueryCriteria。

    // 构造第 2 个表的查询条件
    MultiRowQueryCriteria multiRowQueryCriteria1 = new MultiRowQueryCriteria("orders_small");
    // 添加第 1 行主键信息
    primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("order_id", PrimaryKeyValue.fromString("90fb478c-1360-11f0-a34d-00163e30a2a9"));
    multiRowQueryCriteria1.addRow(primaryKeyBuilder.build());
    // 设置查询版本
    multiRowQueryCriteria1.setMaxVersions(1);
    // Request 添加 MultiRowQueryCriteria
    batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria1);
  • 设置读取的数据版本范围,结果只返回版本范围内的数据。

    // 设置查询的数据版本范围为当前时间往前一天
    multiRowQueryCriteria.setTimeRange(new TimeRange(System.currentTimeMillis() - 86400*1000, System.currentTimeMillis()));
  • 指定读取的属性列。

    multiRowQueryCriteria.addColumnsToGet("col1");

相关文档