全部產品
Search
文件中心

Tablestore:建立資料表

更新時間:Apr 02, 2024

使用CreateTable介面建立資料表時,需要指定資料表的結構資訊和配置資訊,高效能執行個體中的資料表還可以根據需要設定預留讀/寫輸送量。建立資料表的同時支援建立一個或者多個索引表。

說明
  • 建立資料表後需要幾秒鐘進行載入,在此期間對該資料表的讀/寫資料操作均會失敗。請等待資料表載入完畢後再進行資料操作。

  • 建立資料表時必須指定資料表的主鍵。主鍵包含1個~4個主鍵列,每一個主鍵列都有名稱和類型。

前提條件

  • 已通過控制台建立執行個體。具體操作,請參見建立執行個體

  • 已初始化Client。具體操作,請參見初始化

介面

"""
說明:根據指定表結構資訊建立資料表。

``table_meta``是``tablestore.metadata.TableMeta``類的執行個體,它包含資料表名稱和PrimaryKey的schema。
請參見``TableMeta``類的文檔。當建立一個資料表後,通常需要等待幾秒鐘時間使partition load完成,才能進行各種操作。
``table_options``是``tablestore.metadata.TableOptions``類的執行個體,它包含time_to_live,max_version和max_time_deviation三個參數。
``reserved_throughput``是``tablestore.metadata.ReservedThroughput``類的執行個體,表示預留讀寫輸送量。
``secondary_indexes``是一個數組,可以包含一個或多個``tablestore.metadata.SecondaryIndexMeta``類的執行個體,表示要建立的全域二級索引。

返回:無。
""" 
def create_table(self, table_meta, table_options, reserved_throughput, secondary_indexes=[]):          

參數

參數

說明

table_meta

資料表的結構資訊,包括如下內容:

  • table_name:資料表名稱。

  • schema_of_primary_key:資料表的主鍵定義。更多資訊,請參見主鍵和屬性

    說明

    屬性列不需要定義。Tablestore每行的資料列都可以不同,屬性列的列名在寫入時指定。

    • Tablestore可包含1個~4個主鍵列。主鍵列是有順序的,與使用者添加的順序相同。例如PRIMARY KEY(A, B, C)與PRIMARY KEY(A, C, B)是不同的兩個主鍵結構。Tablestore會按照整個主鍵的大小對行進行排序。

    • 第一列主鍵作為分區鍵。分區鍵相同的資料會存放在同一個分區內,所以相同分區鍵下最好不要超過10 GB以上資料,否則會導致單分區過大,無法分裂。另外,資料的讀/寫訪問最好在不同的分區鍵上均勻分布,有利於負載平衡。

  • defined_columns:預先定義一些非主鍵列以及其類型,可以作為索引表的屬性列或索引列。

table_options

資料表的配置資訊。更多資訊,請參見資料版本和生命週期

配置資訊包括如下內容:

  • time_to_live:資料生命週期,即資料的到期時間。當資料的儲存時間超過設定的資料生命週期時,系統會自動清理超過資料生命週期的資料。

    資料生命週期至少為86400秒(一天)或-1(資料永不到期)。

    建立資料表時,如果希望資料永不到期,可以設定資料生命週期為-1;建立資料表後,可以通過UpdateTable介面動態修改資料生命週期。

    單位為秒。

    說明

    如果需要使用索引,則資料生命週期必須設定為-1(資料永不到期)。

  • max_version:最大版本數,即屬性列能夠保留資料的最大版本個數。當屬性列資料的版本個數超過設定的最大版本數時,系統會自動刪除較早版本的資料。

    建立資料表時,可以自訂屬性列的最大版本數;建立資料表後,可以通過UpdateTable介面動態修改資料表的最大版本數。

    說明

    如果需要使用索引,則最大版本數必須設定為1。

  • max_time_deviation:有效版本偏差,即寫入資料的時間戳記與系統目前時間的偏差允許最大值。只有當寫入資料所有列的版本號碼與寫入時時間的差值在資料有效版本偏差範圍內,資料才能成功寫入。

    屬性列的有效版本範圍為[資料寫入時間-有效版本偏差,資料寫入時間+有效版本偏差)

    建立資料表時,如果未設定有效版本偏差,系統會使用預設值86400;建立資料表後,可以通過UpdateTable介面動態修改有效版本偏差。

    單位為秒。

reserved_throughput

為資料表配置預留讀輸送量或預留寫輸送量。

容量型執行個體中的資料表的預留讀/寫輸送量只能設定為0,不允許預留。

預設值為0,即完全隨用隨付。

單位為CU。

  • 當預留讀輸送量或預留寫輸送量大於0時,Tablestore會根據配置為資料表預留相應資源,且資料表建立成功後,將會立即按照預留輸送量開始計費,超出預留的部分進行隨用隨付。更多資訊,請參見計費概述

  • 當預留讀輸送量或預留寫輸送量設定為0時,Tablestore不會為資料表預留相應資源。

secondary_indexes

索引表的結構資訊,每個SecondaryIndexMeta包括如下內容:

  • index_name:索引表名稱。

  • primary_key_names:索引表的索引列,索引列為資料表主鍵和預定義列的組合。

    使用本地二級索引時,索引表的第一個主鍵列必須與資料表的第一個主鍵列相同。

  • defined_column_names:索引表的屬性列,索引表屬性列為資料表的預定義列的組合。

  • index_type:索引類型。可選值包括IT_GLOBAL_INDEX和IT_LOCAL_INDEX。

    • 當不設定index_type或者設定index_type為IT_GLOBAL_INDEX時,表示使用全域二級索引。

      使用全域索引時,Tablestore以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。

    • 當設定index_type為IT_LOCAL_INDEX時,表示使用本地二級索引。

      使用本地二級索引時,Tablestore以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

樣本

  • 建立資料表(不帶索引)

    建立一個有2個主鍵列,資料保留1年(60*60*24*365=31536000秒),最大版本數3,寫入時間戳記位移小於1天(86400秒),預留讀寫輸送量為(0, 0)的資料表。

    # 建立主鍵列的schema,包括主鍵的個數、名稱和類型。
    # 第一個PK列為整型,名稱是pk0,該列同時也是分區鍵。
    # 第二個PK列為整型,名稱是pk1。其他可選的類型包括STRING和BINARY,此處使用INTEGER。
    schema_of_primary_key = [('pk0', 'INTEGER'), ('pk1', 'INTEGER')]
    
    # 通過資料表名稱和主鍵列的schema建立一個tableMeta。
    table_meta = TableMeta('SampleTable', schema_of_primary_key)
    
    # 建立TableOptions,資料保留31536000秒,超過後自動刪除;最大3個版本;寫入時指定的版本值和目前時間相差不能超過86400秒(即1天)。
    table_options = TableOptions(31536000, 3, 86400)
    
    # 設定預留讀輸送量為0,預留寫輸送量為0。
    reserved_throughput = ReservedThroughput(CapacityUnit(0, 0))
    
    # 調用client的create_table介面,如果沒有拋出異常,則說明執行成功。
    try:
        ots_client.create_table(table_meta, table_options, reserved_throughput)
        print "create table succeeded"
    # 如果拋出異常,則說明執行失敗,處理異常。
    except Exception:
        print "create table failed."            

    詳細代碼請參見CreateTable@GitHub

  • 建立資料表(帶索引且索引類型為全域二級索引)

    schema_of_primary_key = [('gid', 'INTEGER'), ('uid', 'STRING')]
    defined_columns = [('i', 'INTEGER'), ('bool', 'BOOLEAN'), ('d', 'DOUBLE'), ('s', 'STRING'), ('b', 'BINARY')]
    table_meta = TableMeta(table_name, schema_of_primary_key, defined_columns)
    table_option = TableOptions(-1, 1)
    reserved_throughput = ReservedThroughput(CapacityUnit(0, 0))
    secondary_indexes = [
        SecondaryIndexMeta('index1', ['i', 's'], ['bool', 'b', 'd']),
        ]
    client.create_table(table_meta, table_option, reserved_throughput, secondary_indexes)                    
  • 建立資料表(帶索引且索引類型為本地二級索引)

    schema_of_primary_key = [('gid', 'INTEGER'), ('uid', 'STRING')]
    defined_columns = [('i', 'INTEGER'), ('bool', 'BOOLEAN'), ('d', 'DOUBLE'), ('s', 'STRING'), ('b', 'BINARY')]
    table_meta = TableMeta(table_name, schema_of_primary_key, defined_columns)
    table_option = TableOptions(-1, 1)
    reserved_throughput = ReservedThroughput(CapacityUnit(0, 0))
    secondary_indexes = [
        SecondaryIndexMeta('index1', ['gid', 's'], ['bool', 'b', 'd'],index_type= SecondaryIndexType.LOCAL_INDEX),
        ]
    client.create_table(table_meta, table_option, reserved_throughput, secondary_indexes)