1.4.1 创建表

优质
小牛编辑
130浏览
2023-12-01

TableInfo createTable(String tableName, TableSpec tableSpec)

功能

在开发者帐号下,以指定表结构和元数据创建表

方法参数

tableName : String : required

新建的表的名称,不能与账户下现有的表重名,

只能以字母(区分大小写)、数字、下划线和连接线组成

tableSpec : TableSpec : required

新建表的schema和meta数据定义,包含了schema和meta两部分

其中schema部分包括

1.entityGroupSpec : EntityGroupSpec : optional

entityGroupSpec包括List< KeySpec > attributes, 用于指定作为实体组键的属性,及每个属性的编码方式(asc/desc)

enableHash, 指定是否对实体组键开启哈希分布

2.primaryIndex : List< KeySpec > : required

指定作为主键的属性,及每个属性的编码方式(asc/desc)

3.attributes : Map< String, DataType > : required

属性名到属性数据类型的映射,定义表的属性名和属性的数据类型,必须包括之前定义的entityGroupSpec和primaryIndex中定义的属性

4.secondaryIndexes : Map< String, LocalSecondaryIndexSpec > : optional

可对表建多个二级索引,该参数为二级索引名到二级索引定义LocalSecondaryIndexSpec的映射,定义表的二级索引

其中LocalSecondaryIndexSpec包含以下几个字段:

  • indexSchema : List< KeySpec > 指定对哪些属性建立索引, 与及作为索引记录键值时的编码方式(asc/desc)
  • consistencyMode : SecondaryIndexConsistencyMode, 定义索引类型, LAZY 、EAGER或IMMUTABLE
  • projections : List< String >, 属性名列表,定义索引记录中包含主记录的哪些属性的拷贝,只有索引类型为EAGER或IMMUTABLE时才能设置

5.streams : Map< String, StreamSpec > : optional

可对表建多个Stream,该参数为topic名到Stream定义StreamSpec的映射,定义表的Stream集合

其中StreamSpec包含以下几个字段:

  • viewType : StreamViewType,表示Stream类型,包括RECORD_IMAGE和MUTATE_LOG
  • attributes : List< String >,需要track的属性名列表
  • enableStream : boolean,使能开关

6.ttl : int : optional

表中数据的存活时间,单位为秒,即从写入开始,过了这段时间数据会自动删除,默认为-1,永不删除

7.preSplits : int : optional

表初始分片数目,仅支持Entity Group开启hash分布的表,且仅在建表时起作用,范围是[ 1, 256 ]

meta部分

1.quota : TableQuota : required

指定表的空间大小配额

2.throughput : ProvisionThroughput : required

指定表的读写配额

3.appAcl : Map< String, List< CannedAcl > > : optional

定义表的在其帐号下的app的访问权限,参考权限模型

4.description : String : optional

表的简要描述

  1. exceededThroughput : ProvisionThroughput : required

主集群最大超发的读写配额,即系统空闲时可能达到的最大吞吐,设置比throughput大即允许超发

  1. slaveThroughput : ProvisionThroughput : required

预设备集群读写配额

  1. exceededSlaveThroughput : ProvisionThroughput : required

备集群最大超发的读写配额,即系统空闲时可能达到最大的吞吐,设置比slaveThroughput大即允许超发

方法返回值

tableInfo : TableInfo

1.name : String

所建表的表名

2.spec : TableSpec

所建表的tableSpec,和和所传入的tableSpec参数相比,该值的meta结构体里多了tableId和developerId

3.state : TableState

包括表的创建时间,最近一次的修改时间,最近一次统计表空间大小及行数的时间,表的空间大小,表行数

异常错误码

INTERNAL_ERROR(1) : 服务器异常

ACCESS_DENIED(4) : 不具有创建表的权限

VALIDATION_FAILED(5): 参数错误

SIZE_EXCEED(6) : 表数量,空间配额或者读写配额超过了用户的总配额

RESOURCE_ALREADY_EXISTS(10) : 已存在同名的表

RESOURCE_UNAVAILABLE(11) : 该账户下有其它DDL操作正在进行,不允许同时进行DDL操作

限制

只有开发者才能创建表

二级索引只有在设置了实体组键才支持

preSplits只有设置了实体组键且开启了哈希才能设置

示例

以示例表为例,下面给出建表的示例代码

$tableName = "php-note";
// create table
$tableSpec = new TableSpec(array(
  'schema' => new TableSchema(array(
      'entityGroup' => new EntityGroupSpec(array(
          'attributes' => array(new KeySpec(array('attribute' => 'userId'))),
          'enableHash' => true, // hash distribution
        )),
      // Creation time order
      'primaryIndex' => array(
        new KeySpec(array('attribute' => 'noteId', 'asc' => false)),
      ),
      'secondaryIndexes' => array(
        // Default display order, sorted by last modify time
        'mtime' => new LocalSecondaryIndexSpec(array(
            'indexSchema' => array(
              new KeySpec(array('attribute' => 'mtime', 'asc' => false)),
            ),
            'projections' => array('title', 'noteId'),
            'consistencyMode' => SecondaryIndexConsistencyMode::EAGER,
          )),
        // Search by category
        'cat' => new LocalSecondaryIndexSpec(array(
            'indexSchema' => array(
              new KeySpec(array('attribute' => 'category')),
            ),
            'consistencyMode' => SecondaryIndexConsistencyMode::LAZY,
          )),
      ),
      'attributes' => array(
        'userId' => DataType::STRING,
        'noteId' => DataType::INT64,
        'title' => DataType::STRING,
        'content' => DataType::STRING,
        'mtime' => DataType::INT64,
        'category' => DataType::STRING,
      ),
    )),
  'metadata' => new TableMetadata(array(
      'quota' => new TableQuota(array('size' => 100 * 1024 * 1024)), 
      'throughput' => new ProvisionThroughput(array(
          'readCapacity' => 200,
          'writeCapacity' => 200
        ))
    ))
));
$adminClient->createTable($tableName, $tableSpec);