[英]How do you deduplicate records in a BigQuery table?
我们有一个脚本应该每天凌晨 12 点在 GCP 云 function 上运行,还有一个调度程序将数据发送到 bigquery 中的表。 不幸的是,cron 作业过去每分钟在上午 12 点发送数据,这意味着文件将被上传 60 次而不是一次 cron 计时器是 * * 3 * * * 而不是 00 3 * * *
我们怎样才能修好桌子? 注意到传输的数据现在已从源中删除,到目前为止我们依赖于获取唯一值,但表变得太大了
任何帮助将非常感激
我有两种选择供您选择,另外还有一条关于将来如何避免这种情况的评论。 我建议在继续之前阅读并比较这两个选项。
如果这是一次性修复,我建议您简单地
your_dataset.your_table
)SELECT DISTINCT * FROM your_dataset.your_table
your_dataset.your_table_deduplicated
)your_dataset.your_table
)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 添加一个阶段以预过滤新记录。
根据您的要求,此阶段可能
SELECT some_unique_id FROM your_dataset.your_table
-> old_record_ids
new_records = [record for record in prepared_records if record["id"] not in old_record_ids]
这将防止您在这里遇到的那种问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.