構造化された行キー クエリ
テーブルに行キーのスキーマがあり、構造化された行キーが定義されている場合は、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 |