使用 Java SDK 创建宽表模型数据表,并在创建时配置表结构、数据版本、索引、Stream 和加密。
前提条件
安装 Tablestore Java SDK并初始化客户端。
功能说明
调用createTable方法创建宽表模型数据表。请求中至少需要包含一个主键列,并指定数据生命周期和最大版本数。
public CreateTableResponse createTable(CreateTableRequest createTableRequest) throws TableStoreException, ClientException以下示例创建名为example_table的数据表。该表包含一个STRING类型的主键列,数据永不过期,最多保留一个版本。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
client.createTable(request);创建数据表后,请等待数据表加载完成再执行数据操作。
参数说明
CreateTableRequest包含以下参数。
名称 | 类型 | 说明 |
tableMeta(必选) |
| 数据表的表结构。 |
tableOptions(必选) |
| 数据表的数据版本和更新配置。 |
reservedThroughput(可选) |
| 预留读写吞吐量,单位为 CU。默认读 CU 和写 CU 均为 |
indexMeta(可选) |
| 与数据表同时创建的二级索引列表。 |
streamSpecification(可选) |
| Stream 配置。 |
enableLocalTxn(可选) |
| 是否开启局部事务,默认值为 |
sseSpecification(可选) |
| 数据加密配置。数据加密只能在创建数据表时开启,创建后无法关闭或更改加密配置。 |
表结构
tableMeta 的类型为 TableMeta,包含以下参数。
名称 | 类型 | 说明 |
tableName(必选) |
| 数据表名称。 |
primaryKey(必选) |
| 主键列配置。支持设置 1~4 个主键列,第一个主键列为分区键,数据默认按主键升序排列。 |
definedColumns(可选) |
|
主键列
tableMeta.primaryKey[] 中每个元素的类型为 PrimaryKeySchema,包含以下参数。
名称 | 类型 | 说明 |
name(必选) |
| 主键列名称。 |
type(必选) |
| 主键列类型。取值为 |
option(可选) |
| 主键列选项。将非分区键的 |
预定义列
tableMeta.definedColumns[] 中每个元素的类型为 DefinedColumnSchema,包含以下参数。
名称 | 类型 | 说明 |
name(必选) |
| 预定义列名称。 |
type(必选) |
| 预定义列类型。取值为 |
表配置
tableOptions 的类型为 TableOptions,包含以下参数。
名称 | 类型 | 说明 |
timeToLive(必选) |
| 数据生命周期,单位为秒。设置为 |
maxVersions(必选) |
| 每个属性列最多保留的版本数。使用多元索引或二级索引时必须设置为 |
maxTimeDeviation(可选) |
| 有效版本偏差,单位为秒,默认值为 |
allowUpdate(可选) |
| 是否允许通过 |
updateFullRow(可选) |
| 是否开启整行更新,默认值为 |
预留读写吞吐量
reservedThroughput 的类型为 ReservedThroughput,包含以下参数。
名称 | 类型 | 说明 |
capacityUnit(必选) |
| 预留读写吞吐量配置。 |
容量单元
reservedThroughput.capacityUnit 的类型为 CapacityUnit,包含以下参数。
名称 | 类型 | 说明 |
readCapacityUnit(必选) |
| 预留读吞吐量,单位为 CU。 |
writeCapacityUnit(必选) |
| 预留写吞吐量,单位为 CU。 |
二级索引
indexMeta[] 中每个元素的类型为 IndexMeta,包含以下参数。
名称 | 类型 | 说明 |
indexName(必选) |
| 索引名称。 |
primaryKey(必选) |
| 索引主键列,可由数据表的主键列和预定义列组成。本地二级索引的第一个主键列必须与数据表的第一个主键列相同。 |
definedColumns(可选) |
| 索引包含的预定义列,必须是数据表中已定义的预定义列。 |
indexType(可选) |
| 索引类型。取值为 |
indexUpdateMode(可选) |
| 索引更新模式。全局二级索引必须设置为 |
Stream 配置
streamSpecification 的类型为 StreamSpecification,包含以下参数。
名称 | 类型 | 说明 |
enableStream(必选) |
| 是否开启 Stream,默认值为 |
expirationTime(可选) |
| 增量日志的保留时长,单位为小时,最大值为 |
局部事务配置
enableLocalTxn 的类型为 Boolean。设置此参数时需注意以下事项。
仅 Java SDK 5.11.0 及以上版本支持局部事务。
局部事务和主键列自增不能同时使用。如果配置了主键列自增,即使开启局部事务也不会生效。
如果创建数据表时未开启局部事务,后续需要使用该功能,请提交工单或加入钉钉技术交流群36165029092。
服务端加密配置
sseSpecification 的类型为 SSESpecification,包含以下参数。
名称 | 类型 | 说明 |
enable(必选) |
| 是否开启数据加密,默认值为 |
keyType(可选) |
| 加密类型。取值为 |
keyId(可选) |
| 用户主密钥 ID。使用 BYOK 加密时必须设置。 |
roleArn(可选) |
| RAM 角色 ARN。使用 BYOK 加密时必须设置。 |
场景示例
配置表结构和数据版本
以下示例创建包含两个主键列和一个预定义列的数据表,并设置有效版本偏差和是否允许更新。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("device_id", PrimaryKeyType.INTEGER));
tableMeta.addDefinedColumn("status", DefinedColumnType.STRING);
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
tableOptions.setMaxTimeDeviation(86400L);
tableOptions.setAllowUpdate(false);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
client.createTable(request);创建数据表时添加二级索引
以下示例创建数据表时同步创建名为example_table_index的全局二级索引。索引主键category必须先声明为数据表的预定义列。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
tableMeta.addDefinedColumn("category", DefinedColumnType.STRING);
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
IndexMeta indexMeta = new IndexMeta("example_table_index");
indexMeta.addPrimaryKeyColumn("category");
indexMeta.setIndexType(IndexType.IT_GLOBAL_INDEX);
indexMeta.setIndexUpdateMode(IndexUpdateMode.IUM_ASYNC_INDEX);
List<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
indexMetas.add(indexMeta);
CreateTableRequest request =
new CreateTableRequest(tableMeta, tableOptions, indexMetas);
client.createTable(request);开启 Stream
以下示例在创建数据表时开启 Stream,并将增量日志的过期时间设置为 24 小时。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
request.setStreamSpecification(new StreamSpecification(true, 24));
client.createTable(request);开启局部事务
以下示例在创建数据表时通过setLocalTxnEnabled方法开启局部事务。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
request.setLocalTxnEnabled(true);
client.createTable(request);加密数据表
以下示例分别使用 KMS 服务密钥和 BYOK 加密数据表。
数据加密仅支持在创建数据表时配置。数据表创建完成后,不能关闭加密或更改加密配置。
KMS 服务密钥加密
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
request.setSseSpecification(
new SSESpecification(true, SSEKeyType.SSE_KMS_SERVICE));
client.createTable(request);BYOK 加密
如需使用 BYOK 加密,请先获取用户主密钥 ID 和 RAM 角色 ARN。具体操作,请参见BYOK加密。
TableMeta tableMeta = new TableMeta("example_table");
tableMeta.addPrimaryKeyColumn(
new PrimaryKeySchema("id", PrimaryKeyType.STRING));
TableOptions tableOptions = new TableOptions();
tableOptions.setTimeToLive(-1);
tableOptions.setMaxVersions(1);
CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
String keyId = "key-xxxx****";
String roleArn = "acs:ram::1234****:role/example-role";
request.setSseSpecification(
new SSESpecification(true, SSEKeyType.SSE_BYOK, keyId, roleArn));
client.createTable(request);