如何删除 dfs 表中的重复数据?

Posted

技术标签:

【中文标题】如何删除 dfs 表中的重复数据?【英文标题】:How to remove the duplicated data in a dfs table? 【发布时间】:2021-09-30 06:07:13 【问题描述】:

如何去除dfs表中的重复数据?

我使用以下脚本创建了一个包含一些重复数据的 dfs 表:

login("admin", "123456")
if(existsDatabase("dfs://compoDB"))
    dropDatabase("dfs://compoDB")

ID = `a`a`a`a`a`a`a
date = 2017.08.07 2017.08.07 2017.08.08 2017.08.08 2017.08.09 2017.08.09 2017.08.09
x = 1 1 2 2 3 3 3
t = table(ID, date, x)

dbDate = database(, VALUE, 2017.08.07..2017.08.11)
dbID= database(, HASH, [SYMBOL, 8])
db = database("dfs://compoDB", COMPO, [dbDate, dbID])
pt = db.createPartitionedTable(t, `pt, `date`ID)
pt.append!(t)

此表中有一些重复数据。现在我想从中删除重复的数据。怎么办?

【问题讨论】:

【参考方案1】:

想法:

step1:将分布式表的数据取到内存表t中。 step2:对内存表t进行去重删除操作。 step3:删除dfs表中涉及的分区,进行数据去重。 step4:将去重内存表t重写回分布式表。

上述场景的代码可以这样写:

def DeletDuplicateData(DBname, TBname, days)
    for(day in days)
        pt = loadTable(DBname, TBname)
        t = select * from pt where date=day
        delete from t where  isDuplicated([ID, date, x], LAST)=true
        trydropPartition(database(DBname), days) catch(ex)print ex
        pt.append!(t)
    

DBname = "dfs://compoDB"
TBname = "pt"
days = 2000.01.01..2021.06.30
ploop(DeletDuplicateDataDBname, TBname, days)
loop(DeletDuplicateDataDBname, TBname, days)

注意:可以选择ploop和loop其中之一来执行。

这是为了对 2001.01.01 到 2021.06.30 的数据进行重复数据删除。如果计算机内存资源比较大,建议并行执行。如果电脑内存资源比较少,日常数据量比较大,推荐串口操作。

执行上述代码后,查询dfs表:

select * from loadTable("dfs://compoDB", `pt)

结果

ID date x
a 2017.08.07 1
a 2017.08.08 2
a 2017.08.09 3

【讨论】:

【参考方案2】:

可以尝试将delete和map的操作结合起来。可以使用以下语句对 dfs 表进行重复数据删除:

delete from pt where  isDuplicated([ID, date, x], LAST)=true map

【讨论】:

以上是关于如何删除 dfs 表中的重复数据?的主要内容,如果未能解决你的问题,请参考以下文章

oracle之如何删除表中的重复记录只保留其中一条

如何删除雪花数据库表中的重复记录

SQL中表里面怎么删除重复数据

Oracle如何删除表中重复记录

Mysql数据库中多条重复数据,如何只删除一条?

MySQL 处理重复数据:防止表中出现重复数据统计过滤删除重复数据