如何修复 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数据库
NavigationView 中意外填充 Swift UI 列表 [重复]