如何将myTable中匹配Names表的CustomerName替换为OriginalName?
在KDB+中根据多列映射替换客户名称
问题背景
现有两个KDB+表:
- Names表:包含列
OriginalName、username1至username7,数据如下:
Names:([] OriginalName: "Frank Rochitz"; username1:""; username2: "fro2"; username3:"fro3"; username4: "fro5"; username5:"id001"; username6:"id001"; username7:"")
- myTable表:仅含
CustomerName列,数据示例:
myTable:([]CustomerName: "Frank Rochitz";"fro5";"fro4")
补充说明:
- Names表固定长度,最多20行
- myTable表可包含数千行数据(如2000行)
需求:检查myTable中的CustomerName是否存在于Names表的任意列中,若存在则将其替换为Names表中对应的OriginalName。
解决方案
由于Names表数据量极小,我们可以先构建一个别名到原始名称的映射字典,再用字典快速替换myTable中的值,这种方式效率极高(字典查询为O(1))。
步骤1:构建别名映射字典
// 提取Names表中所有用户名相关列(排除OriginalName) usernameCols: cols Names except `OriginalName // 将Names表转换为长格式,收集所有非空别名与对应OriginalName的映射 nameMappings: raze {[row] original: row.OriginalName; // 收集该行所有有效别名:包含OriginalName本身+非空的用户名 aliases: original, where not null row[usernameCols]; // 生成每个别名对应的OriginalName键值对 (aliases; enlist original)\[count aliases] } each Names // 构建字典,处理重复别名(保留第一个映射,同一OriginalName的重复别名不影响结果) nameDict: first each group nameMappings[0]!nameMappings[1]
步骤2:替换myTable中的CustomerName
// 用字典替换,不存在的名称保留原值 updatedMyTable: update CustomerName: nameDict @ CustomerName from myTable
如果需要将不存在的名称也替换为某个默认值(例如原示例中fro4被替换为Frank Rochitz,可根据业务需求调整),可以修改为:
// 假设不存在的名称默认映射到指定原始名称 defaultOriginal: first Names.OriginalName updatedMyTable: update CustomerName: $[CustomerName in key nameDict; nameDict @ CustomerName; defaultOriginal] from myTable
结果验证
执行上述代码后,针对示例myTable的输出(使用默认值替换逻辑)为:
updatedMyTable CustomerName ------------- Frank Rochitz Frank Rochitz Frank Rochitz
内容的提问来源于stack exchange,提问作者Dhanuushri
相关产品推荐
相关产品推荐

