【问题标题】:How to fix accidentally duplicated data in a BigQuery table?如何修复 BigQuery 表中意外重复的数据?
【发布时间】: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 的数据直接重新导入到临时表中,但如果可能的话,我宁愿避免这种情况。

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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案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 代码来改进此答案。
          猜你喜欢
          • 1970-01-01
          • 2019-08-29
          • 2018-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-19
          • 2021-03-31
          • 2019-11-20
          相关资源
          最近更新 更多