繁体   English   中英

如何删除 BigQuery 表中的重复记录?

[英]How do you deduplicate records in a BigQuery table?

我们有一个脚本应该每天凌晨 12 点在 GCP 云 function 上运行,还有一个调度程序将数据发送到 bigquery 中的表。 不幸的是,cron 作业过去每分钟在上午 12 点发送数据,这意味着文件将被上传 60 次而不是一次 cron 计时器是 * * 3 * * * 而不是 00 3 * * *

我们怎样才能修好桌子? 注意到传输的数据现在已从源中删除,到目前为止我们依赖于获取唯一值,但表变得太大了

任何帮助将非常感激

我有两种选择供您选择,另外还有一条关于将来如何避免这种情况的评论。 我建议在继续之前阅读并比较这两个选项。

选项一

如果这是一次性修复,我建议您简单地

  1. 导航到 UI 中的表 ( your_dataset.your_table )
  2. 单击“快照”并创建一个快照,以防您在下一部分中犯错
  3. 在 UI 中运行SELECT DISTINCT * FROM your_dataset.your_table
  4. 单击“保存结果”和 select“bigquery 表”,然后另存为新表(例如your_dataset.your_table_deduplicated
  5. 导航回旧表并单击“删除”按钮,然后授权删除
  6. 导航到新表并单击“复制”按钮,然后将其保存在旧表之前所在的位置(即调用副本your_dataset.your_table
  7. 删除your_dataset.your_table_deduplicated

此过程将导致您将当前表替换为具有相同架构但没有重复记录的另一个表。 在丢弃快照之前,您应该检查它是否符合您的预期。

方案二

一种更快的方法(如果您愿意的话)是使用数据操作语言 (DML)。

有一个DELETE语句,但您必须构造一个适当的WHERE子句以仅删除重复的行。

有一种更简单的方法,相当于选项一,只需要您运行此查询:

CREATE OR REPLACE TABLE your_dataset.your_table AS
SELECT DISTINCT * FROM your_dataset.your_table

同样,您可能希望在运行之前拍摄快照。

未来

如果您有一个按计划将数据发送到 BigQuery 的云 function,那么最佳做法是让这个 function 是幂等的(即不管您运行多少次,如果输入相同,output 就是相同的)。

一个典型的模式是向您的 function 添加一个阶段以预过滤新记录。

根据您的要求,此阶段可能

  • 准备要插入的新记录,它应该有一些唯一的、不可变的 ID 字段
  • SELECT some_unique_id FROM your_dataset.your_table -> old_record_ids
  • 过滤新记录,例如 python new_records = [record for record in prepared_records if record["id"] not in old_record_ids]
  • 仅上传尚不存在的记录

这将防止您在这里遇到的那种问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM