如何将kdb表中键值对格式的labels列拆分为多列?
KDB表拆分labels列为独立列的实现方法
针对你给出的表结构,我们可以用两种简洁的方式实现labels列的拆分,自动补全缺失键的空值:
方法一:字典映射法
这种方法通过将每个labels列表转为字典,再按所有唯一键提取对应值,适合数据量不大的场景:
// 构造测试表(与你的表结构一致) t: ([] app: `app1`app2; type: `frontend`backend; labels: ("language:js";"owner:bob";"license:GPL"); ("language:go";"owner:alice")) // 提取所有出现过的标签键 all_keys: distinct raze first each ":" vs' each t.labels // 定义转换函数:将单个labels列表转为指定键的取值列表 get_label_vals: {[keys; ls] label_dict: dict flip ":" vs' ls // 把键值对字符串转为字典 {label_dict[x] @ ""} each keys // 按键取值,缺失则返回空字符串 } // 合并原表与拆分后的标签列 result: t, ([] flip get_label_vals[all_keys] each t.labels)
执行后result就是目标表结构:
app type language owner license ------------------------------------------- app1 frontend "js" "bob" "GPL" app2 backend "go" "alice" ""
方法二:透视表法
如果数据量较大,用透视表的方式更高效,适合批量处理:
// 构造测试表 t: ([] app: `app1`app2; type: `frontend`backend; labels: ("language:js";"owner:bob";"license:GPL"); ("language:go";"owner:alice")) // 拆分labels为多行,每行对应一个键值对 t_ungroup: ungroup update label: each labels from t // 将label拆分为key和value列 t_split: update key:first each ":" vs label, value:last each ":" vs label from t_ungroup // 透视表转换,将key转为列 result_pivot: pivot[select app, type, key, value from t_split; `app`type; `key; `value] // 将空值替换为空字符串 result_pivot: update {x @ ""} each language, owner, license from result_pivot
两种方法都能实现需求,你可以根据实际数据规模选择合适的方式。
内容的提问来源于stack exchange,提问作者Hiruma
相关产品推荐
相关产品推荐

