处理 BigQuery(嵌套表)中的重复项

Posted

技术标签:

【中文标题】处理 BigQuery(嵌套表)中的重复项【英文标题】:Handling duplicates in BigQuery (Nested Table) 【发布时间】:2019-10-22 11:15:39 【问题描述】:

我认为这是一个非常简单的问题,但我希望得到一些指导:我不想删除一个表来发送一个包含重复数据删除记录的新表,例如根据下面使用 BigQuery 的查询使用 DELETE FROM , 是否可以? PS:这是一个嵌套表!

SELECT
  *
FROM (
  SELECT
    *,
    ROW_NUMBER()
          OVER (PARTITION BY id, date_register) row_number
  FROM
    dataset.table)
WHERE
  row_number = 1 
 order by id, date_register

【问题讨论】:

是的,当然可以,请参阅此问题以获得更多指导:***.com/questions/57900777/… @BenP 在我的情况下,我有一个 row_number 用于复制,它不在其源表中。我最初做了一个测试,他删除了所有记录... =D 【参考方案1】:

在不重新创建表的情况下就地去重 - 使用MERGE

MERGE `temp.many_random` t
USING (
  SELECT DISTINCT *
  FROM `temp.many_random`
)
ON FALSE
WHEN NOT MATCHED BY SOURCE THEN DELETE
WHEN NOT MATCHED BY TARGET THEN INSERT ROW

它比当前接受的答案更简单,因为它不会要求您匹配当前的分区或集群 - 它只会尊重它。

【讨论】:

@Felipe Hoffa 根据 BenP 的评论,我尝试使用它,但我无法与表格区分开来,因为它是嵌套的! Yun在这种情况下的选择是在这种情况下有效的选择。如果您碰巧看到任何没有不同的合并方式(并且是 row_number),我添加此答案选项!【参考方案2】:

更新:还请查看 Felipe Hoffa 的更简单的答案,并在此帖子中了解更多信息:BigQuery Deduplication。


您需要从输出中排除 row_number 并使用 CREATE OR REPLACE TABLE 覆盖您的表:

CREATE OR REPLACE TABLE your_table AS
PARTITION BY DATE(date_register) 
SELECT
  * EXCEPT(row_number)
FROM (
  SELECT
    *,
    ROW_NUMBER()
          OVER (PARTITION BY id, date_register) row_number
  FROM your_table)
WHERE
  row_number = 1 

如果您没有在源中定义分区字段,我建议您使用分区字段创建一个新表以使此查询正常工作,以便您可以自动执行该过程。

【讨论】:

我需要的是使用建议的选择更新当前表,而无需执行 DROP TABLE。就好像您要执行 DELETE FROM BenP 的评论与我需要的一样接近,但我无法使用 row_number 删除我需要的行。 @FelipeFB 用CREATE OR REPLACE TABLE更新了我的答案 "不能用不同的分区规范替换表。相反,删除表,然后重新创建它。新的分区规范为无,现有的规范为间隔(类型:天)" @FelipeFB 在AS SELECT之前添加PARTITION BY interval子句

以上是关于处理 BigQuery(嵌套表)中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 取消嵌套数组 - 获取重复项

将重复的列从 CSV 转换为嵌套的 BigQuery 表?

Bigquery:UNNEST 重复与展平表性能

在 BigQuery 中取消嵌套多个嵌套字段

如何在bigquery中获取重复嵌套字段的长度

从 BigQuery 中的重复嵌套列中获取参数数组