结构化行键查询

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

后续步骤