有分段读取DFS表的例子吗?
例如,我想从数据库中按一定大小的块(例如1000条记录)顺序读取数据。
方法一:分页查询
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中,导致后续数据反序列化失败。