Avro データをクエリする
Bigtable 用の GoogleSQL を使用すると、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 |
message オブジェクト | ドット表記(record.field など)を使用して、ネストされたフィールドにアクセスします。 |
enum |
ENUM |
列挙型シンボル セット |
array |
ARRAY |
繰り返しフィールド。Bigtable はネストされた配列をサポートしていません。 |
map<T> |
繰り返される Key-Value エントリ | Avro マップには STRING キーがあります。Bigtable は、{"type": "map", "values": ["null", "string"]} などの null 値を持つマップをサポートしています。ARRAY_TRANSFORM 関数を使用して、マップを ARRAY<STRUCT<key STRING, value T>> に変換できます。 |
union |
null 値を指定できるフィールド | Bigtable は、null と 1 つの null 以外の型のユニオンを標準の null 値許容フィールドにマッピングします。 |
fixed |
Bigtable は fixed 型をサポートしていません。 |
固定長のバイト シーケンス。 |
データの例
このページの例では、my_avro ID を持つ 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 フィールドの Key-Value ペアを 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"}] |
ビューで使用する
Avro スキーマ バンドルは、継続的マテリアライズド ビューと論理ビューで参照できます。
継続的なマテリアライズド ビューまたは論理ビューが Avro スキーマ バンドルを参照している場合、バンドルを削除することはできません。バンドルを削除する前に、バンドルを参照する継続的なマテリアライズド ビューを削除する必要があります。バンドルを参照する論理ビューについては、ビューを更新して参照を削除するか、ビューを削除する必要があります。
次のコマンドは、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: スキーマ バンドルを参照する継続的なマテリアライズド ビューの IDINSTANCE_ID: Bigtable インスタンスの ID
次のステップ
- Avro スキーマを作成して管理する方法を学習する。
- protobuf データにクエリを実行する方法を確認する。
- スキーマ設計のベスト プラクティスについて確認する。