如何删除 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 表中的重复数据?的主要内容,如果未能解决你的问题,请参考以下文章