如何将kdb表中字典类型列转换为表(含异构键场景)
处理KDB中键集合不一致的字典列转表问题
当字典列的键集合不统一时,直接用uj合并会因键不匹配返回字典列表。解决核心是先补全所有字典的缺失键(用null填充对应值),再合并成表,具体操作如下:
完整实现步骤与示例
// 原始表 q)t1:([] a:1 2 3 ; b: `a`b`c; d:(`x`y!(1 2); `x`y!(11 22); `x`y`z!(111 222 333))) // 1. 提取所有字典的键的并集,确定最终表的列集合 q)allKeys:distinct raze keys each t1.d `x`y`z // 2. 扩展每个字典,补全缺失键(缺失键对应值自动设为null) q)extendedDicts:{[keys;d] keys!d[keys]}[allKeys] each t1.d `x`y`z!(1;2;0N) `x`y`z!(11;22;0N) `x`y`z!(111;222;333) // 3. 合并扩展后的字典为结构化表 q)(uj/) value extendedDicts x y z ---------- 1 2 11 22 111 222 333
简化一行写法
可以将步骤合并为单行代码,减少中间变量:
q)(uj/) value {[allKeys;d] allKeys!d[allKeys]}[distinct raze keys each t1.d] each t1.d x y z ---------- 1 2 11 22 111 222 333
原理说明
distinct raze keys each t1.d:遍历所有字典的键,扁平化后去重,得到所有需要的列名keys!d[keys]:用完整键集合重新构造字典,缺失的键会自动填充0N(KDB中的null值),确保所有字典的键集合完全一致- 键统一后,
(uj/) value就能正确对齐列,合并成标准表结构
内容的提问来源于stack exchange,提问作者Invictus
相关产品推荐
相关产品推荐

