KDB中查找含指定列的表并生成列-表映射字典及代码问题
KDB中实现列名到表名列表的字典
简便实现方案
KDB的向量式编程风格可以让你用更简洁的代码完成这个需求,无需循环更新字典:
假设你有一个指定的表名列表tableList(比如t1t2t3,如果要包含环境中所有表可以用tables[]替代),可以这样生成目标字典:
// 生成所有(列名,表名)键值对 colTabPairs: raze {t: x; (cols t) !\: enlist t} each tableList; // 按列名分组,得到列名对应表名列表的字典 colTabDict: group colTabPairs;
说明
{t: x; (cols t) !\: enlist t} each tableList:对每个表t,生成该表所有列名与表名的配对(比如表t1有列a和b,则生成at1;bt1)raze:将所有表的配对结果合并成一个列表group:自动将相同列名的表名聚合成列表,最终生成键为列名、值为表名列表的字典
举个例子,若t1包含列a、b,t2包含列b、c,执行后colTabDict的结果是:
a| ,`t1 b| `t1`t2 c| ,`t2
你的代码问题修复
你当前的代码存在几个问题:变量名错误、子函数无法捕获外部参数、全局变量副作用,修复后的版本如下:
GetColTabMapping:{[uniqueCols;tableList] // 函数内初始化字典,避免全局变量污染 colDict:()!(); CheckColInTables:{[tab;col;dict] // 检查列是否存在于当前表 $[col in cols tab; // 若列已在字典中则追加表名,否则初始化 $[col in key dict; dict[col],:enlist tab; dict[col]:enlist tab]; dict]; :dict}; // 遍历每个表,传递uniqueCols和当前字典进行更新 colDict::[{[tab;cols;d] d::CheckColInTables[tab] each cols; :d}[;;colDict]] each tableList; :colDict; };
问题说明
- 原代码中
enlist ab是变量名错误,应为enlist tab - 子函数无法直接访问外部函数的
uniqueCols参数,需要通过显式传递或闭包方式处理 - 使用全局
colDict会导致函数副作用,改为函数内部初始化更安全
内容的提问来源于stack exchange,提问作者Invictus
相关产品推荐
相关产品推荐

