如何向含数组向量列的DolphinDB流表插入数据并固定向量长度?
DolphinDB数组向量列插入与长度约束问题
问题背景
我正在构建存储五级盘口行情数据的DolphinDB流表,部分列为DOUBLE[]、INT[]等数组向量类型,简化表结构如下:
colNames = `code`lastPrice`askPrice`bidPrice`askVol`bidVol colTypes = [SYMBOL, DOUBLE, DOUBLE[], DOUBLE[], INT[], INT[]] share streamTable(100:0, colNames, colTypes) as stream_tick
每行的askPrice和askVol字段需要存储5元素的数组。
尝试直接以列表形式插入数据时出现类型不匹配错误,移除数组向量列后插入正常。使用array()函数包裹数据可成功插入:
insert into stream_tick values ( "300751.SZ", 209.91, array(DOUBLE[]).append!([[209.99, 210.0, 210.3, 210.31, 210.35]]), array(DOUBLE[]).append!([[209.81, 209.80, 209.70, 209.70, 209.66]]), array(INT[]).append!([[4, 1, 11, 2, 1]]), array(INT[]).append!([[4, 207, 14, 1, 2]]) )
疑问
- 数组向量列是否只能通过
array().append!()插入,是否有更直接的语法? array(DOUBLE[], 0, 5)中的initialSize参数是在schema层面固定数组长度为5,还是仅分配初始容量?该参数需在表创建时指定还是仅插入时设置?
综上,想了解DolphinDB能否在表schema层面强制数组向量列的固定长度,还是只能在插入时通过initialSize控制长度?
解答
1. 数组向量列的更直接插入语法
不需要依赖array().append!(),有两种更简洁的插入方式:
- 单个数组构造插入:直接用
array(类型, 数组字面量)构造符合要求的数组向量,示例:insert into stream_tick values ( "300751.SZ", 209.91, array(DOUBLE, [209.99, 210.0, 210.3, 210.31, 210.35]), array(DOUBLE, [209.81, 209.80, 209.70, 209.70, 209.66]), array(INT, [4, 1, 11, 2, 1]), array(INT, [4, 207, 14, 1, 2]) ) - 批量数据插入:用
matrix构造多行数组数据,再转成对应类型的数组向量,适合批量写入场景:// 构造2行批量数据 codes = take("300751.SZ", 2) lastPrices = [209.91, 209.92] askPrices = matrix(209.99 210.0 210.3 210.31 210.35, 210.0 210.01 210.32 210.33 210.36).transpose() // 执行插入 insert into stream_tick values(codes, lastPrices, array(DOUBLE[], askPrices), ...)
2. initialSize参数的作用与设置时机
array(DOUBLE[], 0, 5)中的initialSize仅用于预分配数组的初始内存容量,目的是优化性能、避免频繁扩容的内存开销,并不会固定数组的长度——插入时依然可以写入任意长度的数组元素。
该参数仅在插入数据、构造数组对象时设置,表的schema层面无法通过此参数约束数组长度。
3. 数组固定长度的实现方式
DolphinDB目前无法在表schema层面直接强制数组向量列的固定长度,但可以通过两种方式实现类似约束:
- 插入前手动校验:在写入数据前,检查每个数组的长度是否为5,不符合则过滤或抛出错误;
- 添加表触发器:给流表配置前置插入触发器,自动校验数组长度,拦截不符合要求的数据:
def checkArrayLength(mutable table, msg) { if (any(size(msg.askPrice) != 5) || any(size(msg.askVol) != 5)) { throw "数组长度必须为5" } return true } // 为stream_tick添加插入前校验触发器 addTableTrigger(stream_tick, checkArrayLength, TriggerType.BEFORE_INSERT)
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

