查詢 Avro 資料
您可以使用 GoogleSQL for Bigtable,查詢、篩選及投影 Bigtable 資料表儲存的序列化 Apache Avro 記錄中的個別欄位。在 SQL 查詢中參照 Avro 結構定義組合,即可將位元組資料欄轉換為結構化 Avro 記錄,並擷取巢狀欄位。
查詢 Avro 欄位前,您必須先將 Avro 結構定義上傳至結構定義套件,詳情請參閱「建立及管理 Avro 結構定義」。如要瞭解 GoogleSQL 查詢如何對應至 Bigtable 資料表結構定義,以及如何在 SQL 陳述式中參照資料欄,請參閱「Bigtable 適用的 GoogleSQL 總覽」。
如要在 Java 中使用 GoogleSQL 查詢 Avro 資料,請使用 Cloud Bigtable 用戶端程式庫中的 executeQuery 方法。如需使用用戶端程式庫執行 SQL 查詢的範例,請參閱「用戶端程式庫」。
Avro 資料類型對應
將序列化的 BYTES 轉換為 Avro 記錄時,Bigtable 適用的 GoogleSQL 會將 Avro 結構定義類型對應至可透過 SQL 存取的類型,如下所示:
| Avro 類型 | GoogleSQL 表示法 | 說明 |
|---|---|---|
int、long |
INT64 |
32 位元和 64 位元帶正負號整數會對應至 64 位元整數。 |
float |
FLOAT32 |
單精度浮點值 |
double |
FLOAT64 |
雙精度浮點值 |
boolean |
BOOL |
布林值 (TRUE 或 FALSE) |
string |
STRING |
萬國碼 (Unicode) 字元序列 |
bytes |
BYTES |
原始位元組序列 |
record |
訊息物件 | 使用點標記法存取巢狀欄位 (例如 record.field)。 |
enum |
ENUM |
列舉符號集 |
array |
ARRAY |
重複欄位。Bigtable 不支援巢狀陣列。 |
map<T> |
重複的鍵/值項目 | Avro 對應有 STRING 鍵。Bigtable 支援具有可為空值的值的對應,例如 {"type": "map", "values": ["null", "string"]}。您可以使用 ARRAY_TRANSFORM 函式,將地圖轉換為 ARRAY<STRUCT<key STRING, value T>>。 |
union |
可為 null 的欄位 | Bigtable 會將包含空值和一個非空值類型的聯集,對應至標準可為空值欄位。 |
fixed |
Bigtable 不支援 fixed 類型。 |
固定長度的位元組序列。 |
範例資料
本頁範例使用 ID 為 my_avro 的 Avro 結構定義組合。這個套件包含 com.example.billing 命名空間中的下列 Transaction 記錄結構定義:
{
"type": "record",
"namespace": "com.example.billing",
"name": "Transaction",
"fields": [
{"name": "product_name", "type": "string"},
{"name": "product_category", "type": "string"},
{"name": "configs", "type": {"type": "map", "values": "string"}}
]
}
名為 table 的 Bigtable 資料表會將序列化的 Avro 記錄儲存在 cf 資料欄系列和 product 資料欄限定詞 (cf['product']) 中:
| 資料列索引鍵 | cf['product'] 欄 (儲存為序列化 BYTES,以 JSON 格式顯示,方便閱讀) |
|---|---|
row1 |
{"product_name": "Chips", "product_category": "yummy food", "configs": {"size": "large", "flavor": "BBQ"}} |
row2 |
{"product_name": "Apple", "product_category": "yummy food", "configs": {}} |
row3 |
{"product_name": "Book", "product_category": "reading", "configs": {"author": "Jane Doe"}} |
查詢範例
上傳 Avro 結構定義套件後,您可以在 Bigtable 的 GoogleSQL 中使用 CAST 運算子,將 BYTES 值解讀為 Avro 記錄。
轉換資料欄及投影欄位
如要將 BYTES 值轉換為 Avro 記錄,請以下列格式指定完整記錄名稱:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME
更改下列內容:
SCHEMA_BUNDLE_ID:結構定義組合的 IDFULLY_QUALIFIED_RECORD_NAME:Avro 記錄的全名,包括 Avro 結構定義中定義的命名空間,例如com.example.billing.Transaction
如果指定的結構定義套件或記錄名稱不存在,查詢就會失敗,並顯示 INVALID_ARGUMENT 狀態和 type not found 錯誤訊息。如果提供的結構定義無法剖析儲存格位元組,查詢就會失敗,並顯示 FAILED_PRECONDITION 或 INVALID_ARGUMENT 狀態。
下列查詢會將 cf['product'] 欄轉換為 my_avro 結構定義套件中的 com.example.billing.Transaction 記錄,並投影 product_name 欄位:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table;
查詢會傳回下列結果:
product_name (STRING) |
|---|
| 晶片 |
| Apple |
| 書籍 |
根據 Avro 欄位篩選
您可以使用 WHERE 子句,根據 Avro 記錄中的欄位值篩選資料列。
下列查詢會篩選 product_category 欄位等於 "yummy food" 的資料列:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table
WHERE
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_category = "yummy food";
查詢會傳回下列結果:
product_name (STRING) |
|---|
| 晶片 |
| Apple |
存取地圖欄位
您可以使用 ARRAY_TRANSFORM 函式,將 Avro map 欄位中的鍵/值組合投影為 STRUCT 元素陣列。
下列查詢會投影 product_name,並將 configs 對應欄位轉換為 STRUCT<key STRING, value STRING> 元素陣列:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name,
ARRAY_TRANSFORM(
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).configs,
e -> STRUCT(e.key, e.value)
) AS map_array
FROM
table;
查詢會傳回下列結果:
product_name (STRING) |
map_array (ARRAY<STRUCT<key STRING, value STRING>>) |
|---|---|
| 晶片 | [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}] |
| Apple | [] |
| 書籍 | [{"key": "author", "value": "Jane Doe"}] |
與檢視表搭配使用
您可以在持續性 materialized view 和邏輯檢視表中參照 Avro 結構定義套件。
如果連續 materialized view 或邏輯檢視表參照 Avro 結構定義組合,則無法刪除該組合。刪除套件前,請務必先刪除參照該套件的所有連續 materialized view。對於參照套件的任何邏輯檢視,您必須更新檢視以移除參照,或刪除檢視。
下列指令會建立持續性 materialized view,依 product_name 匯總交易次數:
gcloud bigtable materialized-views create MATERIALIZED_VIEW_ID \
--instance=INSTANCE_ID \
--query="SELECT CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name AS product, COUNT(*) AS transaction_count FROM table GROUP BY product;"
更改下列內容:
MATERIALIZED_VIEW_ID:參照結構定義套件的連續 materialized view IDINSTANCE_ID:Bigtable 執行個體的 ID
後續步驟
- 瞭解如何建立及管理 Avro 結構定義。
- 瞭解如何查詢 protobuf 資料。
- 參閱結構定義設計最佳做法。