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

时间:2018-02-05 16:09:54

标签: google-bigquery

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

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

Is it possible to recover overwritten data in BigQuery

2 个答案:

答案 0 :(得分:2)

首先使用与您的"丢失"完全相同的架构的东西(任何东西)再次覆盖您的桌子。表

然后按照参考文章中的相同步骤进行操作 -

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

如果您的表在上周左右或创建后没有更改

,则可以使用@ 0

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

答案 1 :(得分:0)

您可以在 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