構造化された行キー クエリ

テーブルに行キーのスキーマがあり、構造化された行キーが定義されている場合は、SQL を使用して行キーの個々のセグメント(列)をクエリできます。

グローバル セカンダリ インデックスを含む継続的マテリアライズド ビューは、デフォルトで構造化された行キーを生成します。SQL でクエリする Bigtable テーブルの構造化された行キーを定義するには、テーブルの行キー スキーマを作成します。詳細については、行キー スキーマを管理するをご覧ください。

キー

構造化された行キー スキーマのない Bigtable テーブルでは、各行は単一の行キーでインデックスに登録されます。SQL でテーブルをクエリすると、行キーは _key という名前の列になり、SQL はこれを主キーとして使用します。疑似列ではないため、テーブルに対して SELECT * クエリを実行すると、_key 列の値が返されます。

一方、行キー スキーマを持つテーブルでは、行キー(主キー)は、行キー スキーマのフィールドとして名前が付けられたすべての列の組み合わせです。テーブルに行キー スキーマを追加すると、_key 列は疑似列になります。つまり、SELECT * クエリには表示されませんが、SELECT _key ステートメントで明示的に選択できます。

サンプルクエリ

このセクションの例では、sales という名前のテーブルに次のスキーマがあることを前提としています。

  field {
    field_name: "user_id"
    type: { bytes_type { encoding { raw {} } } }
  }
  field {
    field_name: "purchase_date"
    type: { string_type { encoding { utf8_bytes {} } } }
  }
  field {
    field_name: "order_number"
    type: { string_type { encoding { utf8_bytes {} } } }
  }
  encoding {
    delimited_bytes { delimiter "#" }
  }

sales テーブルには次のデータが含まれています。product 列ファミリーには 2 つの列があります。

行キー product
  product_type product_name
"user1#2025-05-20#abcd1233" "phone" 「iPhone16_pro_max」
"user1#2025-05-20#abcd1235" 「靴」 「nike_hyperdunk」
"user2#2025-05-24#defg456" 「ヘッドフォン」 「sony_wh_1000mx5」

構造化された行キーのクエリ結果

sales テーブルには構造化された行キーがあるため、SELECT * ステートメントを使用してテーブルにクエリを実行すると、クエリは行キーの各セグメントを個別の列として返します。Bigtable テーブルに対する SQL クエリと同様に、列ファミリーの列はマップとして表されます。

  SELECT * from sales

結果は次のようになります。

user_id purchase_date order_number product
ユーザー 1 2025-05-20 "abcd1233" { product_type: "phone", product_name: "iPhone16_pro_max" }
ユーザー 1 2025-05-20 "abcd1235" { product_type: "shoes", product_name: "nike_hyperdunk" }
ユーザー 2 2025-05-24 "defg456" { product_type: "headphones", product_name: "sony_wh_1000mx5" }

次の例に示すように、クエリで行キー列を指定することもできます。

  SELECT
    product[product_type] AS product_type,
    product[product_name] AS product_name
  FROM sales
  WHERE user_id = b"user1"

結果は次のようになります。

product_type product_name
"phone" 「iphone16_pro_max」
「靴」 「nike_hyperdunk」

フィルタ

SQL 関数を使用して、行キー スキーマの列でフィルタできます。次の例では、CURRENT_DATE()2025-05-24 を返すことを前提としています。

  SELECT
    user_id,
    product["product_name"] AS product_name
  FROM
    sales
  WHERE
    PARSE_DATE("YYYY-MM-DD", purchase_date) = CURRENT_DATE()
    AND user_id = b"user2"

結果は以下のとおりです。

user_id product_name
ユーザー 2 「sony_wh_1000mx5」

集計クエリ

次の例は、構造化された行キー フィールドで集計クエリを使用する方法を示しています。

  SELECT
    user_id,
    product[product_type] AS product_type,
    count(*) AS count
  FROM sales
  GROUP BY 1, 2

クエリ結果は次のとおりです。

user_id product_type count
ユーザー 1 電話 1
ユーザー 1 shoes 1
ユーザー 2 ヘッドフォン 1

元の行キー

構造化された行キーを持つテーブルで元の行キーを取得するには、クエリで _key 列を指定します。

  SELECT
    _key, user_id
  FROM sales

クエリから次の結果が返されます。

_key user_id
"user1#2025-05-20#abcd1233" ユーザー 1
"user1#2025-05-20#abcd1235" ユーザー 1
"user2#2025-05-24#defg456" ユーザー 2

次のステップ