KDB中用fills填充空子列表遇'nyi报错,求正确实现方案
问题原因
fills 函数目前不支持对列表类型的列进行填充(报错 'nyi 表示该功能尚未实现),因为 fills 仅针对原子类型(如数值、字符串等)生效。
解决方法
方法一:使用 scan 函数(简洁高效)
直接通过 scan 遍历列元素,累积填充空列表:
t: update a: {if[0=count y; x; y]} scan a from t;
逻辑说明:scan 会依次处理 a 列的每个元素,函数判断如果当前元素是空列表(count y=0),就返回前一个非空的累积值;否则保留当前元素,自动完成最近非空值的填充。
方法二:通过索引间接填充(适配复杂场景)
先处理索引再映射回原列表:
// 1. 生成索引数组:非空元素位置设为自身索引,空元素位置设为0N idxArr: `long$0N; idxArr[where 0 < count'[t.a]]: til count t; // 2. 用fills填充索引数组(fills支持原子类型的索引) filledIdx: fills idxArr; // 3. 根据填充后的索引更新a列 t: update a: a[filledIdx] from t;
逻辑说明:先标记所有非空列表的位置,再用 fills 填充索引数组得到每个位置对应的最近非空元素索引,最后通过索引映射替换空列表。
验证结果
两种方法执行后,表 t 的输出均符合预期:
q) show t a --- 1 2 1 2 1 2 5 6 5 6 5 6
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

