在 Bigtable 強制執行資料類型

Bigtable 的結構定義富有彈性,可讓您在 Bigtable 資料表中儲存任何類型的資料,包括字串、日期、數字、JSON 文件,甚至是圖片或 PDF。

本文說明 Bigtable 何時會強制執行類型,要求您在應用程式程式碼中編碼或解碼。如需 Bigtable 資料類型清單,請參閱 Data API 參考文件中的「Type」。

強制執行的類型

下列資料會強制執行資料類型:

  • 匯總資料欄系列 (計數器)
  • 時間戳記
  • 持續性 materialized view
  • 結構化資料列索引鍵

匯總

如果是匯總資料類型,編碼方式取決於匯總類型。建立匯總資料欄系列時,必須指定匯總類型。

下表列出各匯總類型的輸入類型和編碼。

匯總類型 輸入類型 編碼
總和 Int64 BigEndianBytes
Min Int64 BigEndianBytes
Max Int64 BigEndianBytes
HLL 位元組 Zetasketch HLL++

使用 SQL 查詢匯總儲存格中的資料時,SQL 會自動納入類型資訊。

使用 Data API 的 ReadRows 方法讀取匯總儲存格中的資料時,Bigtable 會傳回位元組,因此應用程式必須使用 Bigtable 將類型資料對應至位元組時所用的編碼,將值解碼。

您無法將含有非匯總資料的資料欄系列轉換為匯總資料欄系列。匯總資料欄系列中的資料欄不得包含非匯總儲存格,標準資料欄系列則不得包含匯總儲存格。

如要進一步瞭解如何建立含有匯總資料欄系列的資料表,請參閱「建立資料表」。如需程式碼範例,瞭解如何使用編碼值遞增匯總儲存格,請參閱「遞增值」。

時間戳記

每個 Bigtable 儲存格都有一個 Int64 時間戳記,代表自 Unix 紀元 1970-01-01 00:00:00 UTC起經過的微秒數。

時間戳記來源

Bigtable 資料表中的每個時間戳記都有來源,指出時間戳記的設定方式。Bigtable 可辨識下列時間戳記來源:

  • 使用者指定:由您或應用程式設定的時間戳記。
  • Bigtable 產生:用戶端程式庫設定的時間戳記,使用用戶端的本機系統時鐘,或伺服器產生的時間戳記,使用伺服器的目前時間。

時間戳記精細程度和精確度

Bigtable 支援下列時間戳記精細程度:

  • 毫秒精細程度 (預設):時間戳記必須是微秒值,精確度最多到毫秒,例如 3023483279876000。Bigtable 會拒絕使用者指定、精確度達微秒的時間戳記,並將 Bigtable 產生、精確度達微秒的時間戳記截斷至毫秒。
  • 微秒精細程度:時間戳記可以精確到微秒,例如 3023483279876543。Bigtable 接受使用者指定和 Bigtable 產生的時間戳記,精確度可達微秒。

您可以在建立資料表時設定時間戳記精細程度。

時間戳記限制

微秒時間戳記精細程度的資料表有以下限制:

  • 只有 Java 專用 Bigtable 用戶端程式庫 2.82.0 以上版本,才支援微秒時間戳記精細程度。使用其他用戶端的讀取或寫入要求會失敗。
  • 微秒時間戳記精細程度僅適用於 Enterprise Plus 版的執行個體。
  • 資料表建立後,即無法變更時間戳記精細程度。
  • 如果資料表精細程度設為微秒,就無法建立連續 materialized view。
  • 如果資料表精細程度設為微秒,就無法建立邏輯檢視表。
  • 如果執行個體含有精細程度為微秒的資料表,就無法從 Enterprise Plus 降級為 Enterprise。您必須先刪除這些資料表,才能開始降級。
  • 如果資料表精細程度為微秒,則備份只能還原至 Enterprise Plus 執行個體。

持續性 materialized view

持續性 materialized view 是唯讀資源,您可以使用 SQL 或 ReadRows Data API 呼叫來讀取。materialized view 中的資料類型取決於定義該檢視表的查詢。如需總覽,請參閱「持續增補的 materialized view」。

使用 SQL 查詢持續增補的 materialized view 時,SQL 會自動納入類型資訊。

使用 Data API ReadRows 要求讀取連續 materialized view 時,您必須瞭解每個資料欄的類型,並在應用程式程式碼中解碼。

連續 materialized view 中的匯總值會根據檢視表定義中資料欄的輸出類型,使用下表所述的編碼方式儲存。

類型 編碼
BOOL 1 位元組值,1 = true,0 = false
BYTES 不編碼
INT64 (或 INT、SMALLINT、INTEGER、BIGINT、TINYINT、BYTEINT) 64 位元大端序
FLOAT64 64 位元 IEEE 754,不含 NaN 和 +/-inf
STRING UTF-8
TIME/TIMESTAMP 64 位元整數,代表自 Unix 紀元起算的微秒數 (與 GoogleSQL 一致)
詳情請參閱 Data API 參考資料中的 編碼。

結構化資料列索引鍵

結構化資料列索引鍵可讓您使用多欄索引鍵存取資料,類似於關聯式資料庫中的複合索引鍵。

結構化資料列索引鍵的類型和編碼,是由資料列索引鍵結構定義定義,您可以選擇將其新增至 Bigtable 資料表。結構化資料列索引鍵資料會以位元組形式儲存,但對資料表執行 SQL 查詢時,Bigtable 適用的 GoogleSQL 會自動使用資料列索引鍵結構定義中定義的類型和編碼。

不支援使用資料列索引鍵結構定義,透過 ReadRows 要求查詢資料表。持續性 materialized view 預設具有資料列索引鍵結構定義。如要進一步瞭解結構化資料列索引鍵,請參閱「管理資料列索引鍵結構定義」。

未強制執行的類型

如果未提供類型資訊,Bigtable 會將每個儲存格視為編碼未知的位元組。

查詢建立時未強制執行類型的資料欄系列時,必須在讀取時提供類型資訊,確保資料正確讀取。這與行為取決於資料類型的資料庫函式有關。Bigtable 適用的 GoogleSQL 提供 CAST 函式,可在查詢時轉換類型。這些函式會將位元組轉換為各種函式預期的類型。

雖然 Bigtable 不會強制執行類型,但某些作業會假設資料類型。瞭解這點後,您就能確保資料寫入方式可在資料庫中處理。以下是幾個例子:

  • 使用 ReadModifyWriteRow 遞增時,系統會假設儲存格包含 64 位元大端序有正負號整數。
  • SQL 中的 TO_VECTOR64 函式預期儲存格包含位元組陣列,該陣列是 64 位元浮點數的大端序位元組串連。
  • SQL 中的 TO_VECTOR32 函式預期儲存格包含位元組陣列,該陣列是由 32 位元浮點數的大端序位元組串連而成。

後續步驟