创建表时需要指定表的结构信息(TableMeta)和配置信息(TableOptions),也可以根据需求设置表的预留读/写吞吐量(ReservedThroughput)。

说明 表格创建好后服务端需要将表的分片加载到某个节点上,需要等待几秒钟才能对表进行读写,否则会出现异常。

参数说明

  • TableMeta

    TableMeta包含TableName和List。

    参数 说明
    TableName 数据表名称。
    List 表的主键定义。
    • 表格存储可包含1个~4个主键列。主键列是有顺序的,与用户添加的顺序相同,例如PRIMARY KEY(A, B, C)与PRIMARY KEY(A, C, B)是不同的两个主键结构。表格存储会按照主键的大小为行排序,具体参见表格存储数据模型和查询操作
    • 第一列主键作为分片键。分片键相同的数据会存放在同一个分片内,所以相同分片键下最好不要超过10 GB以上数据,否则会导致单分片过大,无法分裂。另外,数据的读/写访问最好在不同的分片键上均匀分布,有利于负载均衡。
    • 属性列不需要定义。表格存储每行的数据列都可以不同,属性列的列名在写入时指定。
  • TableOptions

    TableOptions包含表的TTL、MaxVersions和MaxTimeDeviation。

    参数 说明
    TTL TimeToLive,数据的保存时间。
    • 系统根据数据的时间戳当前时间表的TTL三者判断数据是否过期。当当前时间-数据的时间戳>表的TTL时,系统会自动清理过期的数据。
    • 创建数据表时,如果希望数据永不过期,可以设置TTL为-1;创建数据表后,可以通过UpdateTable接口动态修改数据生命周期。
    • 在使用TTL功能时需要注意写入时是否指定了时间戳以及指定的时间戳是否合理。如果需指定时间戳,建议设置MaxTimeDeviation。
    • 单位为秒。
    MaxTimeDeviation 写入数据的时间戳与系统当前时间的偏差允许最大值。
    • 默认情况下系统会为新写入的数据生成一个时间戳,数据自动过期功能需要根据这个时间戳判断数据是否过期。用户也可以指定写入数据的时间戳。如果用户写入的时间戳非常小,与当前时间偏差已经超过了表上设置的TTL时间,写入的数据会立即过期。设置MaxTimeDeviation可以避免这种情况。
    • 创建数据表时,如果未设置有效版本偏差,系统会使用默认值86400;创建数据表后,可以通过UpdateTable接口动态修改有效版本偏差。
    • 单位为秒。
    MaxVersions 数据表中的属性列能够保留数据的最大版本个数。当属性列数据的版本个数超过设置的最大版本数时,系统会自动删除较早版本的数据。

    创建数据表时,可以自定义属性列的最大版本数;创建数据表后,可以通过UpdateTable接口动态修改数据表的最大版本数。

  • ReservedThroughtput:表的预留读/写吞吐量配置。
    • 设置ReservedThroughtput后,表格存储按照您预留读/写吞吐量进行计费。
    • 当ReservedThroughtput大于0时,表格存储会按照预留量和持续时间进行计费,超出预留的部分进行按量计费。详情请参见计费,以免产生未期望的费用。
    • 默认值为0,即完全按量计费。
    • 容量型实例的预留读/写吞吐量只能设置为0,不允许预留。
  • IndexMetas

    索引表的Meta信息。使用表格存储创建一张数据表时,可以同时为其创建多张索引表。

    参数 说明
    IndexName 索引表名称。
    List<String> primaryKey 索引表类型。

    当前只支持IT_GLOBAL_INDEX。

    List<String> definedColumns 索引表的属性列,必需为主表的预定义列组合。
    IndexType 索引表类型。

    当前只支持IT_GLOBAL_INDEX。

    IndexUpdateMode 索引表更新模式。

    当前只支持IUM_ASYNC_INDEX。

示例

  • 创建表(不带索引)
    private static void createTable(SyncClient client) {
            TableMeta tableMeta = new TableMeta(TABLE_NAME);
            tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME, PrimaryKeyType.STRING)); //为主表添加主键列。
            int timeToLive = -1; //数据的过期时间,单位为秒,-1代表永不过期。带索引表的数据表数据过期时间必须为-1。
            int maxVersions = 3; //保存的最大版本数,带索引表的数据表最大版本数必须为1。
            TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
            CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions);
            request.setReservedThroughput(new ReservedThroughput(new CapacityUnit(0, 0))); //设置读写预留值,容量型实例只能设置为0,高性能实例可以设置为非零值。
            client.createTable(request);
        }
  • 创建表(带索引)
       private static void createTable(SyncClient client) {
            TableMeta tableMeta = new TableMeta(TABLE_NAME);
            tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_1, PrimaryKeyType.STRING)); //为数据表添加主键列。
            tableMeta.addPrimaryKeyColumn(new PrimaryKeySchema(PRIMARY_KEY_NAME_2, PrimaryKeyType.INTEGER)); //为数据表添加主键列。
            tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_1, DefinedColumnType.STRING)); //为数据表添加预定义列。
            tableMeta.addDefinedColumn(new DefinedColumnSchema(DEFINED_COL_NAME_2, DefinedColumnType.INTEGER)); //为数据表添加预定义列。
    
            int timeToLive = -1; //数据的过期时间,单位为秒,-1代表永不过期。带索引表的数据表数据过期时间必须为-1。
            int maxVersions = 1; //保存的最大版本数,带索引表的数据表最大版本数必须为1。
    
            TableOptions tableOptions = new TableOptions(timeToLive, maxVersions);
    
            ArrayList<IndexMeta> indexMetas = new ArrayList<IndexMeta>();
            IndexMeta indexMeta = new IndexMeta(INDEX_NAME);
            indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); //为索引表添加主键列。
            indexMeta.addDefinedColumn(DEFINED_COL_NAME_2); //为索引表添加属性列。
            indexMetas.add(indexMeta);
    
            CreateTableRequest request = new CreateTableRequest(tableMeta, tableOptions, indexMetas); //创建数据表时一同创建索引表。
    
            client.createTable(request);
        }