如何修复 BigQuery 表中意外重复的数据?

Posted

技术标签:

【中文标题】如何修复 BigQuery 表中意外重复的数据?【英文标题】:How to fix accidentally duplicated data in a BigQuery table? 【发布时间】:2016-05-24 10:15:08 【问题描述】:

我正在使用 BigQuery,有一个非常大的表,其中包含 month TIMESTAMP 字段:

code STRING
org STRING
month TIMESTAMP

我不小心将一个月的数据写入了两次,导入两次,然后错误地使用了追加模式。

鉴于 BigQuery 不允许我更新或删除数据,删除重复数据的最佳方法是什么?

我首先将除问题月份之外的所有数据复制到一个临时表中:

SELECT * FROM mytable WHERE month!=TIMESTAMP('2012-01-01')

现在我最想做的是将2012-01-01 的数据一个 复制到同一个临时表中,删除每个重复的行。这在 SQL 中可行吗?

如果不是,我想我可以将2012-01-01 的数据直接重新导入到临时表中,但如果可能的话,我宁愿避免这种情况。

无论哪种方式,我都会将数据的干净副本复制到临时表中,然后将其重新导入到永久表中。

【问题讨论】:

【参考方案1】:

这不是典型的重复数据删除问题,而是修复了意外的数据附加问题。 如果这发生在最近(几天,最多 7 天),我建议尝试Snapshot decorators 它允许您在特定时间引用表的快照。 因此,如果您可以在附加数据之前确定时间 - 这会有所帮助。 您仍然需要从该表中选择数据(使用装饰器)并将其写入新表

【讨论】:

【参考方案2】:

您可以使用带有窗口函数的查询来只选择一个条目,例如这个示例,您可以将结果写入不同的表或同一个表。

select * from (
SELECT 
rank() over (partition by user_id order by timestamp desc) as _rank,
*
FROM [user_profile_event] 
) where _rank=1

在此示例中,我们按 user_id 选择重复项,并使用最新的值,这就是我们有 timestamp desc 的原因。

【讨论】:

【参考方案3】:

您可以通过以下方式删除重复项:

SELECT 
  code
  , org
  , month 
FROM mytable 
WHERE month=TIMESTAMP('2012-01-01')
GROUP BY 1,2,3

【讨论】:

【参考方案4】:

我知道这已经有一段时间了,但是您是否考虑过“SELECT DISTINCT”语句? “SELECT DISTINCT”只为您的列返回不同的(不同的)值。 http://www.dofactory.com/sql/select-distinct

【讨论】:

我不同意审稿人的观点。这不是“仅链接”的答案。但是,您可以通过添加解决 OP 问题所需的精确 SQL 代码来改进此答案。

以上是关于如何修复 BigQuery 表中意外重复的数据?的主要内容,如果未能解决你的问题,请参考以下文章

数据恢复:如何恢复Linux中意外删除的Oracle和MySQL数据库

如何使用phpmyadmin恢复在sql中意外删除的表

NavigationView 中意外填充 Swift UI 列表 [重复]

具有意外相似重复的 postgres 用户表导致另一个表具有混乱的外键,如何修复和合并外键?

如何修复此 BigQuery 表架构的更新查询?

如何过滤 bigquery 的重复表行数据以删除重复行?