在 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 一致) |
結構化資料列索引鍵
結構化資料列索引鍵可讓您使用多欄索引鍵存取資料,類似於關聯式資料庫中的複合索引鍵。
結構化資料列索引鍵的類型和編碼,是由資料列索引鍵結構定義定義,您可以選擇將其新增至 Bigtable 資料表。結構化資料列索引鍵資料會以位元組形式儲存,但對資料表執行 SQL 查詢時,Bigtable 適用的 GoogleSQL 會自動使用資料列索引鍵結構定義中定義的類型和編碼。
不支援使用資料列索引鍵結構定義,透過 ReadRows 要求查詢資料表。持續性 materialized view 預設具有資料列索引鍵結構定義。如要進一步瞭解結構化資料列索引鍵,請參閱「管理資料列索引鍵結構定義」。
未強制執行的類型
如果未提供類型資訊,Bigtable 會將每個儲存格視為編碼未知的位元組。
查詢建立時未強制執行類型的資料欄系列時,必須在讀取時提供類型資訊,確保資料正確讀取。這與行為取決於資料類型的資料庫函式有關。Bigtable 適用的 GoogleSQL 提供 CAST 函式,可在查詢時轉換類型。這些函式會將位元組轉換為各種函式預期的類型。
雖然 Bigtable 不會強制執行類型,但某些作業會假設資料類型。瞭解這點後,您就能確保資料寫入方式可在資料庫中處理。以下是幾個例子:
- 使用
ReadModifyWriteRow遞增時,系統會假設儲存格包含 64 位元大端序有正負號整數。 - SQL 中的
TO_VECTOR64函式預期儲存格包含位元組陣列,該陣列是 64 位元浮點數的大端序位元組串連。 - SQL 中的
TO_VECTOR32函式預期儲存格包含位元組陣列,該陣列是由 32 位元浮點數的大端序位元組串連而成。