DolphinDB能删除数据吗?如果有删除操作应该怎么使用?

DolphinDB能删除数据吗?如果有删除操作应该怎么使用?比如删除几条数据

请先 登录 后评论

1 个回答

Xinhai Tang

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)

结果:

attachments-2021-06-Lxl0mP3f60d40fdd20224.png

请先 登录 后评论