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: スキーマ バンドルの ID
  • FULLY_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: スキーマ バンドルを参照する継続的なマテリアライズド ビューの ID
  • INSTANCE_ID: Bigtable インスタンスの ID

次のステップ