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

时间:2016-05-24 10:15:08

标签: sql google-bigquery

我正在使用BigQuery,其中包含一个非常大的表RewriteEngine On RewriteRule ^ci/(.*)$ /$1 [L,R=301,QSA] TIMESTAMP字段:

month

我意外地将数据写入了一个月两次,导入两次,错误地使用追加模式。

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

我已经开始将除问题月份之外的所有数据复制到临时表:

code STRING
org STRING
month TIMESTAMP

现在,我理想的做法是将SELECT * FROM mytable WHERE month!=TIMESTAMP('2012-01-01') 的数据的一个副本,删除每个重复的行,放入同一个临时表中。这可能在SQL中吗?

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

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以执行以下操作删除重复项:

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

答案 2 :(得分:0)

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

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 :(得分:0)

我知道这已经有一段时间了,但你有没有考虑过" SELECT DISTINCT"声明? " SELECT DISTINCT"仅返回列的不同(不同)值。 http://www.dofactory.com/sql/select-distinct