在 Bigquery 中添加它们时获取列时间戳

Posted

技术标签:

【中文标题】在 Bigquery 中添加它们时获取列时间戳【英文标题】:Get column timestamp when they got added in Bigquery 【发布时间】:2022-01-23 03:51:01 【问题描述】:

我正在尝试找出哪些所有新列都添加到了表中。有没有办法找到它?我正在考虑在创建或修改表时获取带有时间戳的表的所有列,以便我可以过滤哪些是新列。

使用 INFORMATION_SCHEMA.SCHEMATA 我只能获得表的创建和修改日期,而不是列。

使用 INFORMATION_SCHEMA.COLUMNS 我可以获得所有列名及其信息,但没有关于其修改或创建时间戳的详细信息。

我的表没有快照,因此我无法将其与以前的版本进行比较以获取更改。

有没有办法捕捉到这个?

【问题讨论】:

【参考方案1】:

正如@RileyRunnoe 提到的,这种元数据不会被 BQ 捕获,一个可能的解决方案是深入审计日志。在执行此操作之前,您应该已经创建了一个指向数据集的 BQ 接收器。详情请见creating a sink。

创建接收器后,所有要执行的操作都会将数据使用日志存储在您在接收器中选择的 BigQuery 数据集下的表 cloudaudit_googleapis_com_data_access_YYYYMMDD 和表 cloudaudit_googleapis_com_activity_YYYYMMDD 中。请记住,您只能从设置日志导出表之日开始跟踪使用情况。

下面的查询有一个从 cloudaudit_googleapis_com_data_access_* 查询的 CTE,因为它会记录数据更改并且只获取已完成的作业,因此过滤 jobservice.jobcompleted。查询 CTE 以获取包含 "COLUMN" 的查询,并且不包括像我们即将运行的查询那样没有目标表的查询。

WITH CTE AS (
    SELECT 
        protopayload_auditlog.methodName,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.query as query,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobStatus.state as status,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.datasetId as dataset,
        protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query.destinationTable.tableId as table,
        timestamp
    FROM `my-project.dataset_name.cloudaudit_googleapis_com_data_access_*` 
        WHERE protopayload_auditlog.methodName = 'jobservice.jobcompleted'
)

SELECT query,
    REGEXP_EXTRACT(query,r'ADD COLUMN (\w+) \w+') as column,
    table,
    timestamp,
    status
FROM CTE
    WHERE query like '%COLUMN%' 
    AND NOT REGEXP_CONTAINS(dataset, r'^_')
    ORDER BY timestamp DESC

结果:

【讨论】:

【参考方案2】:

根据 BigQuery 列文档,这不是 BigQuery 当前捕获的元数据。

一个可能的解决方案是进入BigQuery logs 查看表格的更新时间和方式。对创建这些表的架构和脚本的源代码控制还可以让您深入了解添加列的方式和时间。

【讨论】:

以上是关于在 Bigquery 中添加它们时获取列时间戳的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google BigQuery / Apps 脚本为插入 Google 表格的数据添加时间戳

BigQuery 没有以毫秒为单位处理带有分区列的时间戳

Bigquery:如何将 2 个时间戳列合并为 1 个列?

如何在 BigQuery 中获取连续时间戳之间的差异

在bigquery中转换整个表的时间戳

BigQuery 合并 JSON 文档