处理 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(嵌套表)中的重复项的主要内容,如果未能解决你的问题,请参考以下文章