如何通过删除基于 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_id
、col_2_id
、col_3
、col_4
、col_5
、col_6
、col_7
、col_8
问题是有许多行具有相同的 col_1_id
和 col_2_id
并且我必须使其唯一。我曾尝试根据两列对表进行 GROUP BY,然后选择第一列,但这会占用太多内存。
如何清理表格,以确保没有两行具有相同的col_1_id
、col_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