如何通过删除基于 8 列中的 2 列的重复项来清理 BigQuery 表?

Posted

技术标签:

【中文标题】如何通过删除基于 8 列中的 2 列的重复项来清理 BigQuery 表?【英文标题】:How to clean a BigQuery table by removing duplicates based on 2 of 8 columns? 【发布时间】:2018-06-06 15:58:01 【问题描述】:

我有一个 google BigQuery 表,其中列有 col_1_idcol_2_idcol_3col_4col_5col_6col_7col_8

问题是有许多行具有相同的 col_1_idcol_2_id 并且我必须使其唯一。我曾尝试根据两列对表进行 GROUP BY,然后选择第一列,但这会占用太多内存。

如何清理表格,以确保没有两行具有相同的col_1_idcol_2_id

这是我尝试过但失败的:

SELECT
  col_1_id,
  col_2_id,
  ANY_VALUE(col_3), 
  ANY_VALUE(col_4),
  ANY_VALUE(col_5),
  ANY_VALUE(col_6),
  ANY_VALUE(col_7),
  ANY_VALUE(col_8)
FROM
  `my_proj.my_table` A
GROUP BY
  A.col_1_id,
  A.col_2_id

但我收到如下消息:

错误:查询执行期间资源超出:无法在分配的内存中执行查询。 GROUP BY 运算符占用了太多内存

而且我不确定这将如何删除行。

我怎样才能有一个查询来就地删除重复项或使用结果创建一个新表?

【问题讨论】:

我的第一个想法是使用更高的计费等级。 【参考方案1】:

我会尝试重新创建表:

CREATE TABLE new_tab_name
AS
SELECT * EXCEPT rn
FROM(SELECT *,ROW_NUMBER() OVER(PARTITION BY col_1_id,col_2_id ORDER BY 1) AS rn
     FROM tab_name) sub
WHERE rn = 1;

之后删除旧表并重命名。


编辑:

使用QUALIFY clause:

CREATE OR REPLACE TABLE tab_name AS
SELECT *
FROM tab_name
QUALIFY ROW_NUMBER() OVER(PARTITION BY col_1_id,col_2_id ORDER BY 1) = 1;

【讨论】:

如果row_number() 能在group by 在BQ 中失败的地方工作,我会非常感到惊讶。 @GordonLinoff 让 user1367204 试试 :) @lad2025 。 . .我觉得很有趣。我还没有发现 row_number() 可以解决 BQ 中的这个问题。

以上是关于如何通过删除基于 8 列中的 2 列的重复项来清理 BigQuery 表?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一列中的值删除一列的重复项,Python,Pandas

在excel中查找两列的组合,一列中有一个条件

根据 2 列和第三列中的条件删除重复行

调整相对于 2 列的选择以在一列中返回最大值以用于另一列中的重复条目

从文本文件中删除每个单独列中的重复项

删除单个单元格中的重复ID