【发布时间】:2022-01-03 09:59:38
【问题描述】:
如何在 DolphinDB 中进行重复数据删除,有什么例子可以参考吗?现在,似乎数据库保留了所有数据。我可以看到 keyedTable 或 indexedTable 会丢弃重复数据,但是还有其他方法吗?
【问题讨论】:
标签: duplicates dolphindb
如何在 DolphinDB 中进行重复数据删除,有什么例子可以参考吗?现在,似乎数据库保留了所有数据。我可以看到 keyedTable 或 indexedTable 会丢弃重复数据,但是还有其他方法吗?
【问题讨论】:
标签: duplicates dolphindb
写入数据时去重(2.0或更高版本):
要查找已安装的版本并查看是否需要更新,请运行 version。在www.dolphindb.com 更新到最新版本。
需要TSDB引擎进行重复数据删除。将函数'database'中的参数'engine'指定为“TSDB”以启用TSDB引擎:
login(`admin,`123456)
if(existsDatabase("dfs://tsdb"))
{
dropDatabase("dfs://tsdb")
}
//create a distributed database and specify the parameter engine to be TSDB
db_tsdb = database(directory = "dfs://tsdb", partitionType = VALUE, partitionScheme = 2012.03.01..2022.12.31, engine = 'TSDB')
然后创建 3 个具有不同重复数据删除规则的 DFS 表。 createPartitionedTable中通过参数sortColumns指定排序列,通过参数keepDuplicates指定去重规则。重复数据删除仅在识别出重复的键值时运行。有 3 个可选的重复数据删除规则:
在下面的例子中,我们创建3个DFS表,指定键列为“ID”和“Date”,keepDuplicates分别为“LAST”、“ALL”和“FIRST”:
t = table(1:0,`Date`ID`Close,[DATETIME,SYMBOL,DOUBLE])
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="last", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=LAST)
last = db_tsdb.loadTable(`last)
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="all", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=ALL)
all = db_tsdb.loadTable(`all)
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="first", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=FIRST)
first = db_tsdb.loadTable(`first)
写入没有重复排序列的数据并查询表:
Date = 2012.03.01 09:30:00..(2012.03.01 09:30:00 + 4)
ID = `000001`000001`000002`000002`000002
Close =1.0 2.0 3.0 4.0 5.0
first_table = table(Date,ID,Close)
last.append!(first_table)
all.append!(first_table)
first.append!(first_table)
select * from last
select * from all
select * from first
以上 3 个表格返回的结果与图表中显示的相同。
然后写入具有相同排序列的数据。
Date = 2012.03.01 09:30:00..(2012.03.01 09:30:00 + 4)
ID = `000001`000001`000002`000002`000002
Close =10.0 20.0 30.0 40.0 50.0
second_table = table(Date,ID,Close)
last.append!(second_table)
all.append!(second_table)
first.append!(second_table)
select * from last
select * from all
select * from first
写入的数据不同,3张表应用不同的去重规则,查询结果也会不同。
带有LAST 参数的表保留keyColumns 重复的最新数据:
带有FIRST 参数的表保留keyColumns 重复的第一个数据:
带有ALL 参数的表会保留每次重复keyColumns 时写入的数据:
我的脚本:
login(`admin,`123456)
if(existsDatabase("dfs://tsdb"))
{
dropDatabase("dfs://tsdb")
}
db_tsdb = database(directory = "dfs://tsdb", partitionType = VALUE, partitionScheme = 2012.03.01..2022.12.31, engine = 'TSDB')
t = table(1:0,`Date`ID`Close,[DATETIME,SYMBOL,DOUBLE])
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="last", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=LAST)
last = db_tsdb.loadTable(`last)
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="all", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=ALL)
all = db_tsdb.loadTable(`all)
tsdb_table = createPartitionedTable(dbHandle = db_tsdb, table=t, tableName="first", sortColumns=["ID","Date"], partitionColumns=`Date, keepDuplicates=FIRST)
first = db_tsdb.loadTable(`first)
Date = 2012.03.01 09:30:00..(2012.03.01 09:30:00 + 4)
ID = `000001`000001`000002`000002`000002
Close =1.0 2.0 3.0 4.0 5.0
first_table = table(Date,ID,Close)
last.append!(first_table)
all.append!(first_table)
first.append!(first_table)
select * from last
select * from all
select * from first
Date = 2012.03.01 09:30:00..(2012.03.01 09:30:00 + 4)
ID = `000001`000001`000002`000002`000002
Close =10.0 20.0 30.0 40.0 50.0
second_table = table(Date,ID,Close)
last.append!(second_table)
all.append!(second_table)
first.append!(second_table)
select * from last
select * from all
select * from first
【讨论】: