结构化行键查询
如果某个表的行键架构定义了结构化行键,您可以使用 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 |