在DolphinDB中分段读取数据

问题描述 投票:0回答:1

有分段读取DFS表的例子吗?

例如,我想从数据库中按一定大小的块(例如1000条记录)顺序读取数据。

database api dolphindb
1个回答
0
投票

方法一:分页查询

n = 100
SecurityID = rand(`st0001`st0002`st0003`st0004`st0005, n)
sym = rand(`A`B, n)
TradeDate = 2022.01.01 + rand(100,n)
TotalVolumeTrade = rand(1000..3000, n)
TotalValueTrade = rand(100.0, n)
schemaTable_snap = table(SecurityID, TradeDate, TotalVolumeTrade, TotalValueTrade)
    .sortBy!(`SecurityID`TradeDate)
dbPath = "dfs://TSDB_STOCK"
if(existsDatabase(dbPath)){dropDatabase(dbPath)}
db_snap = database(dbPath, VALUE, 2022.01.01..2022.01.05, engine='TSDB')
snap=createPartitionedTable(dbHandle=db_snap, table=schemaTable_snap, tableName="snap", partitionColumns=`TradeDate, sortColumns=`SecurityID`TradeDate, keepDuplicates=ALL, sortKeyMappingFunction=[hashBucket{,5}])
snap.append!(schemaTable_snap)
offset = 0
pageSize = 1000
select * from loadTable("dfs://TSDB_STOCK", "snap") limit offset, pageSize

您可以控制API端的参数

offset
pageSize
来一次加载一页(1000行)数据。

方法二:使用BlockReader

可以通过API封装BlockReader类来迭代读取一定量的数据。

以Java API为例:

DBConnection conn = new DBConnection();
conn.connect(SERVER, PORT, USER, PASSWORD);
EntityBlockReader v = (EntityBlockReader)conn.run("select * from loadTable(\"dfs://TSDB_STOCK\", \"snap\")",(ProgressListener) null,4,4,1000);
BasicTable data = (BasicTable)v.read();
while(v.hasNext()){
    BasicTable t = (BasicTable)v.read();
    data = data.combine(t);
}

如果数据尚未完全读取,需要停止继续读取数据,则应调用

skipAll
方法跳过剩余数据。否则可能会导致数据残留在socket buffer中,导致后续数据反序列化失败。

© www.soinside.com 2019 - 2024. All rights reserved.