解决方案1:
思路:
step1 :把分布式表的数据取到内存表t
step2:对内存表t进行delete的去重操作
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 try{dropPartition(database(DBname), days)} catch(ex){print ex} pt.append!(t) } } DBname = "dfs://compoDB" TBname = "pt" days = 2000.01.01..2021.06.30 //并行执行 ploop(DeletDuplicateData{DBname, TBname}, days) //串行操作 loop(DeletDuplicateData{DBname, TBname}, days)
注意:ploop和loop选择一个执行即可。
这里是对2000.01.01到2021.06.30的数据进行了去重,如果计算机内存资源比较大,建议并行执行,如果计算机内存资源比较小并且每天的数据量比较大的情况下,建议串行操作。
执行完上述的代码,对dfs表进行查询:
select * from loadTable("dfs://compoDB", `pt)
结果:
解决方案2:
后期版本将支持delete和map的组合用法,对某个dfs表的去重可以用下面的语句完成:
delete from pt where isDuplicated([ID, date, x], LAST)=true map
目前1.30.10版本还不支持,后期版本将支持,请持续关注。