使用旧表架构恢复覆盖的 Bigquery 表

Posted

技术标签:

【中文标题】使用旧表架构恢复覆盖的 Bigquery 表【英文标题】:Recover overwritten Bigquery table with older table schema 【发布时间】:2018-02-05 16:09:53 【问题描述】:

我不小心覆盖了现有表,将其用作临时表来存储另一个选择的结果。如果旧表和新表的表结构不同,有没有办法回滚?是否可以防止某人覆盖特定表以防止将来发生这种情况?

以下问题中有一条评论说,如果表架构不同,则无法恢复。不确定最近是否发生了变化。

Is it possible to recover overwritten data in BigQuery

【问题讨论】:

【参考方案1】:

首先用与“丢失”表具有完全相同架构的东西(任何东西)再次覆盖您的表

然后按照参考帖子中的相同步骤进行操作 - 即:

SELECT * FROM [yourproject:yourdataset.yourtable@<time>]  

如果您的表格在上周左右或自创建以来没有更改,您可以使用 @0

或者,为了避免成本 - 做 bq cp ....

【讨论】:

所以,如果我理解正确,只要当前结构与我要恢复的结构匹配,bq cp 就会用数据恢复旧表。问题是我什至不知道旧模式。表是从不再存在的脚本创建的。我这样做只是为了测试我们现在使用 BigQuery 的实现。但是,我更担心有人可能会像我一样覆盖数据。有没有办法防止管理员以外的任何人对数据集中某些表的架构进行修改? 是的 - 对于第一部分。并且 - 是的 - 你必须知道架构。如果使用了该表 - 您可以通过检查使用该表的旧作业来“逆向工程”架构【参考方案2】:

您可以在 SQL 中恢复。 但是这会丢失可以为空的列和描述字段并产生查询成本

bq query --use_legacy_sql=false "CREATE OR REPLACE TABLE project:dataset.table AS SELECT * FROM project:dataset.table FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE)"

我最近发现这更有效

以毫秒为单位获取 unix 时间戳,并使用 cp 覆盖自身

bq query --use_legacy_sql=false "SELECT DATE_DIFF(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 100 MINUTE), TIMESTAMP '1970-01-01', MILLISECOND)"
bq cp project:dataset.table@1625288152215 project:dataset.table

在你这样做之前,你可以检查以下内容

bq show --schema --format=prettyjson project:dataset.table@1625288152215 > schema-a.json
bq show --schema --format=prettyjson project:dataset.table > schema-b.json
diff schema-a.json schema-b.json

【讨论】:

以上是关于使用旧表架构恢复覆盖的 Bigquery 表的主要内容,如果未能解决你的问题,请参考以下文章

Big Query 中的 Google AdWords 传输:可以更改表架构吗?

无法导出 Big Query 表

除了覆盖表之外,还有其他方法可以更新 Big Query 中的行吗?

在 Big Query 中检索覆盖的已保存查询

将空值设置为缺失表字段的默认值

如何恢复 Big Query 中已删除的行?