结构化行键查询
如果某个表的行键架构定义了结构化行键,您可以使用 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 列族包含两列。
| 行键 | 产品 | |
|---|---|---|
| product_type | product_name | |
| “user1#2025-05-20#abcd1233” | “手机” | "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 | 产品 |
|---|---|---|---|
| user1 | 2025-05-20 | “abcd1233” | { product_type: "手机", product_name: "iPhone16_pro_max" } |
| user1 | 2025-05-20 | “abcd1235” | { product_type: "shoes", product_name: "nike_hyperdunk" } |
| user2 | 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 |
|---|---|
| “手机” | "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 |
|---|---|
| user2 | "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 | 计数 |
|---|---|---|
| user1 | 电话 | 1 |
| user1 | 鞋子 | 1 |
| user2 | 头戴式耳机 | 1 |
原始行键
如需在具有结构化行键的表中检索原始行键,请在查询中指定 _key 列。
SELECT
_key, user_id
FROM sales
查询返回以下内容:
| _key | user_id |
|---|---|
| “user1#2025-05-20#abcd1233” | user1 |
| “user1#2025-05-20#abcd1235” | user1 |
| “user2#2025-05-24#defg456” | user2 |