DolphinDB1.30.6版本开始支持dfs表的delete操作
示例代码如下:
n=1000000 ID=rand(10, n) x=rand(1.0, n) t=table(ID, x) db=database("dfs://rangedb124", RANGE, 0 5 10) pt=db.createPartitionedTable(t, `pt, `ID) pt.append!(t) select count(*) from pt; //1000000 delete from pt where ID=5; select count(*) from pt;
DolphinDB1.20分支本版、DolphinDB1.30.6版本以前不支持dfs表的delete操作,但是可以通过下面的方案进行dfs表数据的修改:
思路:
step1 :把分布式表的数据取到内存表t
step2:对内存表t进行delete的去重操作
step3:删除dfs表需要去重数据涉及的分区
step4:把去重后的内存表t重新写回分布式表
给一个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)
针对上述场景的代码可以这样写:
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)
结果: