划分数据分片

更新时间:
复制 MD 格式

Java SDK 按指定大小将全表数据逻辑划分为若干分片,并返回各分片的主键范围和位置提示。

前提条件

安装 Tablestore Java SDK并初始化客户端。

功能说明

在服务端按指定大小将全表数据逻辑划分为若干分片。分片大小为近似值,返回结果包含每个分片的主键范围(lowerBound / upperBound)和分片所在机器的位置提示(location)。可将返回的主键范围传入 RangeRowQueryCriteria,通过范围读取数据迭代读取数据并行处理各分片。

public ComputeSplitsBySizeResponse computeSplitsBySize(ComputeSplitsBySizeRequest request) throws TableStoreException, ClientException

以下示例将数据表 split_demo 的全表数据按 200 MB 划分为若干分片,并打印每个分片的位置和主键范围。

String tableName = "split_demo";

// 按 200 MB(2 * 100 MB)将全表数据划分为若干分片
ComputeSplitsBySizeRequest request =
        new ComputeSplitsBySizeRequest(tableName, 2);

ComputeSplitsBySizeResponse response = client.computeSplitsBySize(request);

System.out.println("PrimaryKeySchema: " + response.getPrimaryKeySchema());
List<Split> splits = response.getSplits();
System.out.println("Splits size: " + splits.size());

Iterator<Split> iterator = splits.iterator();
while (iterator.hasNext()) {
    Split split = iterator.next();
    // getLowerBound()/getUpperBound() 返回的主键范围可直接传入
    // RangeRowQueryCriteria,交给 getRange 或 createRangeIterator 并行读取
    System.out.println("Location: " + split.getLocation());
    System.out.println("LowerBound: " + split.getLowerBound().jsonize());
    System.out.println("UpperBound: " + split.getUpperBound().jsonize());
}

参数说明

名称

类型

说明

tableName(必选)

String

数据表名称。

splitSize(必选)

long

每个分片的近似大小,单位为 100 MB。例如传入 2 表示按 200 MB 划分。

返回值

分片划分结果

ComputeSplitsBySizeResponse 包含以下业务字段。

名称

类型

说明

splits

List<Split>

逻辑分片列表。通过 getSplits() 获取。

primaryKeySchema

List<PrimaryKeySchema>

数据表的主键结构。通过 getPrimaryKeySchema() 获取。

分片信息

ComputeSplitsBySizeResponse.splits[] 中每个元素的类型为 Split

名称

类型

说明

lowerBound

PrimaryKey

分片主键范围的下界。

upperBound

PrimaryKey

分片主键范围的上界。

location

String

分片所在机器的位置提示,部分场景可能为空字符串。