请问对分布式表(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)

创建了一个有重复数据的分布式表:

attachments-2021-06-lrDPacxa60d4077401248.png

需求:

去除分布式表里面的重复数据。


最终分布式表里面存储的数据如下图所示:

attachments-2021-06-gEIVUXJl60d4077e0ab03.png

请先 登录 后评论

1 个回答

Jason Tang - 时序数据库技术支持

解决方案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)

结果:

attachments-2021-06-Lxl0mP3f60d40fdd20224.png


解决方案2:

后期版本将支持delete和map的组合用法,对某个dfs表的去重可以用下面的语句完成:

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

目前1.30.10版本还不支持,后期版本将支持,请持续关注。

请先 登录 后评论