如何禁止向BigQuery加载重复的行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何禁止向BigQuery加载重复的行?相关的知识,希望对你有一定的参考价值。

我想知道有没有一种方法可以禁止从BigQuery中加载重复的行?

基于 本文 我可以重复复制整个表或表的一个分区。

重复数据删除整个表。

CREATE OR REPLACE TABLE `transactions.testdata`
PARTITION BY date
AS SELECT DISTINCT * FROM `transactions.testdata`;

要根据定义在表中的分区来重复数据删除一个表。WHERE 子句。

MERGE `transactions.testdata` t
USING (
  SELECT DISTINCT *
  FROM `transactions.testdata`
  WHERE date=CURRENT_DATE()
)
ON FALSE
WHEN NOT MATCHED BY SOURCE AND date=CURRENT_DATE() THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW

如果没有办法不允许重复,那么这是否是一个合理的重复复制表的方法?

答案

BigQuery 没有一个机制像 限制 可以在传统DBMS中找到。换句话说,你不能设置一个主键或类似的东西,因为...。BigQuery 不是专注于事务,而是专注于快速分析和可扩展性。你应该把它看作是一个数据湖,而不是一个具有唯一性属性的数据库。

如果你有一个现有的表,并且需要去重复它,上述的方法就可以了。如果你需要你的表在默认情况下具有唯一性行,并希望在你的表中以编程方式插入唯一性行,而不求助于外部资源,我可以向你建议一个变通方法。

  1. 首先将你的数据插入到一个临时表中
  2. 然后,在你的临时表中运行一个查询,并将结果保存到你的实际表中。这一步可以用一些不同的方法来编程完成。

    • 用你提到的方法 排程查询
    • 使用 bq 命令,如 bq query --use_legacy_sql=false --destination_table=<dataset.actual_table> 'select distinct * from <dataset.temporary_table>' 将查询您的临时表中的不同值,并将结果加载到在 --destination_table 属性。其重要的是,这种方法也可以用于分区表。
  3. 最后,放弃临时表。和上一步一样,这一步可以使用计划查询或bq命令来完成。

希望对大家有所帮助

以上是关于如何禁止向BigQuery加载重复的行?的主要内容,如果未能解决你的问题,请参考以下文章

Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中

Bigquery 返回重复的行以及错误的计数

根据条件对 BigQuery 中的行进行重复数据删除

BigQuery MERGE 意外的行重复

错误代码:在 BigQuery 上加载数据时无效

将 CSV 文件从 Google Drive 加载到 BigQuery 会产生零行且没有错误