在 BigQuery 中查询 Bigtable 变更日志
本页面提供了相关指南和示例查询,以帮助您处理 BigQuery 中的 Bigtable 更新日志。
本页面适用于已完成以下操作的用户:
- 设置启用了 Bigtable 变更数据流的表。
- 运行将变更日志写入 BigQuery 的 Dataflow 模板。您可以按照快速入门了解如何对此进行设置。
本指南假定您对 BigQuery 有一定的了解。如需了解详情,您可以 按照介绍如何加载和查询 数据。
打开变更日志表
在 Google Cloud 控制台中,转到 BigQuery 页面。
在探索器面板中,展开您的项目。
展开您的数据集。
点击带有后缀的表:
_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
后续步骤
- 详细了解 Bigtable 更改 数据流。
- 参阅 Bigtable change stream to BigQuery 模板参考页面。
- 了解如何设置 Bigtable change stream to BigQuery 模板。