范围读取数据

更新时间:
复制为 MD 格式

本文介绍如何通过 PHP SDK 范围读取表格存储中的数据。

前提条件

初始化Tablestore Client

方法说明

public function getRange(array $request)

$request参数说明

名称

类型

说明

table_name(必选)

string

数据表名称。

inclusive_start_primary_key(必选)

array

起始主键信息,包括主键列名称和主键值。

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

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

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

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

  • PrimaryKeyTypeConst::CONST_INF_MIN 表示无限小,PrimaryKeyTypeConst::CONST_INF_MAX 表示无限大。

exclusive_end_primary_key(必选)

array

结束主键信息,包括主键列名称和主键值。

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

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

  • PrimaryKeyTypeConst::CONST_INF_MIN 表示无限小,PrimaryKeyTypeConst::CONST_INF_MAX 表示无限大。

direction(必选)

string

读取方向。

  • DirectionConst::CONST_FORWARD:正向读取数据。

  • DirectionConst::CONST_BACKWARD:反向读取数据。

max_versions(可选)

int

最大版本数。

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

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

time_range(可选)

array

数据版本范围。

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

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

limit(可选)

int

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

columns_to_get(可选)

array

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

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

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

column_filter(可选)

array

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

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

示例代码

以下示例代码用于读取 test_table 表中主键值大于 row1 的数据。

$request = array (
    'table_name' => 'test_table',
    // 设置查询起始主键
    'inclusive_start_primary_key' => array (
        array('id', 'row1')
    ),
    // 设置查询结束主键(返回结果不包含结束主键)
    'exclusive_end_primary_key'  => array (
        array('id', null, PrimaryKeyTypeConst::CONST_INF_MAX)
    ),
    // 设置正向读取数据
    'direction' => DirectionConst::CONST_FORWARD,
    // 设置查询版本
    'max_versions' => 1
);

try {
    // 调用 getRange 方法读取行数据
    $response = $client->getRange ($request);

    // 返回结果处理
    echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
    echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
    echo "* Row Data: " . "\n";
    foreach ($response['rows'] as $row) {
        echo json_encode($row) . "\n";
    }
} catch (Exception $e){
    echo "Get Range failed.";
}

单次范围扫描数据上限为 5000 行或者 4 MB,超出限制部分的数据将返回用于下一次读取的起始主键值,您可以参考以下代码进行迭代查询。

while (true) {
    // 调用 getRange 方法读取行数据
    $response = $client->getRange ($request);
    // 返回结果处理
    echo "* Read CU Cost: " . $response['consumed']['capacity_unit']['read'] . "\n";
    echo "* Write CU Cost: " . $response['consumed']['capacity_unit']['write'] . "\n";
    echo "* Row Data: " . "\n";
    foreach ($response['rows'] as $row) {
        echo json_encode($row) . "\n";
    }
    
    if ($response['next_start_primary_key'] != null){
        $request['inclusive_start_primary_key'] = $response['next_start_primary_key'];
    } else {
        break;
    }
}

您也可以在查询数据时参考示例代码进行以下设置。

  • 设置数据读取方向。

    $request = array (
        'table_name' => 'test_table',
        // 设置查询起始主键(反向读取数据时,起始主键要大于结束主键)
        'inclusive_start_primary_key' => array (
            array('id', null, PrimaryKeyTypeConst::CONST_INF_MAX)
        ),
        // 设置查询结束主键(返回结果不包含结束主键)
        'exclusive_end_primary_key'  => array (
            array('id', 'row1')
        ),
        // 设置反向读取数据
        'direction' => DirectionConst::CONST_BACKWARD,
        // 设置查询版本
        'max_versions' => 1
    );
  • 设置读取的数据版本范围,结果只返回版本范围内的数据。

    // 设置查询的数据版本范围为当前时间往前一天
    $request['time_range'] = array (
        'start_time' => intval(microtime(true) * 1000) - 86400 * 1000,
        'end_time' => intval(microtime(true) * 1000)
    );
  • 指定读取的属性列。

    $request['columns_to_get'] = array('col2');
  • 设置单次返回最大行数。

    $request['limit'] = 10;

相关文档

批量读取数据