在 BigQuery 中查询 Bigtable 变更日志

本页面提供了相关指南和示例查询,以帮助您处理 BigQuery 中的 Bigtable 更新日志。

本页面适用于已完成以下操作的用户:

本指南假定您对 BigQuery 有一定的了解。如需了解详情,您可以 按照介绍如何加载和查询 数据

打开变更日志表

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 探索器面板中,展开您的项目。

  3. 展开您的数据集。

  4. 点击带有后缀的表:_changelog

表格式

整个输出架构包含多个列。本指南重点介绍了如何将行连接到列和值,以及将值解析为可分析的格式。

基本查询

本部分中的示例使用 Bigtable 表来跟踪信用卡销售数据。该表包含一个列族 (cf) 和以下列族 列:

  • 行键,格式为 credit card number#transaction timestamp
  • 商家
  • 金额
  • Category
  • 交易日期

查询一列

使用 WHERE 子句将结果过滤为仅一个列族和一个列。

SELECT row_key, column_family, column, value, timestamp,
FROM your_dataset.your_table
WHERE
  mod_type="SET_CELL"
  AND column_family="cf"
  AND column="merchant"
LIMIT 1000

解析值

所有值均存储为字符串或字节字符串。您可以使用转换函数将值类型转换为预期类型。

SELECT row_key, column_family, column, value, CAST(value AS NUMERIC) AS amount
FROM your_dataset.your_table
WHERE
  mod_type="SET_CELL"
  AND column_family="cf"
  AND column="amount"
LIMIT 1000

执行聚合

您可以执行更多操作,例如对数值执行聚合。

SELECT SUM(CAST(value AS NUMERIC)) as total_amount
FROM your_dataset.your_table
WHERE
  mod_type="SET_CELL"
  AND column_family="cf"
  AND column="amount"

透视数据

如需执行涉及多个 Bigtable 列的查询,您需要对表进行数据透视。每个新的 BigQuery 行都包含变更数据流从 Bigtable 表中的对应行返回的一条数据变更记录。根据您的架构,您可以使用 行键和时间戳的组合,对数据进行分组。

SELECT * FROM (
  SELECT row_key, timestamp, column, value
  FROM your_dataset.your_table
)
PIVOT (
  MAX(value)
  FOR column in ("merchant", "amount", "category", "transaction_date")
)

使用动态列集进行数据透视

如果您有一个动态列集,则可以执行一些额外的处理来获取所有列,然后以程序化方式将它们放入查询中。

DECLARE cols STRING;
SET cols = (
  SELECT CONCAT('("', STRING_AGG(DISTINCT column, '", "'), '")'),
  FROM your_dataset.your_table
);

EXECUTE IMMEDIATE format("""
SELECT * FROM (
  SELECT row_key, timestamp, column, value
  FROM your_dataset.your_table
)
PIVOT (
  MAX(value)
  FOR column in %s
)""", cols);

JSON 数据

如果您使用 JSON 设置所有值,则需要解析这些值并提取 根据键指定值在对函数进行推导后,您就可以使用解析函数了。 JSON 对象中的值。下面的示例使用前面介绍的信用卡销售数据,但会将数据作为 JSON 对象写入单个列,而不是将数据写入多个列。

SELECT
  row_key,
  JSON_VALUE(value, "$.category") as category,
  CAST(JSON_VALUE(value, "$.amount") AS NUMERIC) as amount
FROM your_dataset.your_table
LIMIT 1000

使用 JSON 的聚合查询

您可以使用 JSON 值执行聚合查询。

SELECT
  JSON_VALUE(value, "$.category") as category,
  SUM(CAST(JSON_VALUE(value, "$.amount") AS NUMERIC)) as total_amount
FROM your_dataset.your_table
GROUP BY category

后续步骤