KDB+/Q技术问询:如何从分组列表创建映射字典实现数据分类
问题
现有Q表如下:
t:([] creature:`cat`dog`ant`bee`wasp`crocodile; cnt:til 6)
需要新增category列标注生物类型:cat/dog归为animal,ant/bee/wasp归为insect。
目前通过字典映射实现的写法不够简洁:
update category:creature ^ ((`cat`dog`ant`bee`wasp)!(`animal`animal`insect`insect`insect)) creature from t
希望能从分组列表((catdog;animal);(antbeewasp;insect))`直接生成映射字典,简化代码。
解决方案
生成映射字典
用raze+flip each处理分组列表,一键生成所需字典:
mapping: raze flip each ((`cat`dog;`animal);(`ant`bee`wasp;`insect))
执行后mapping的结果为:
cat dog ant bee wasp!animal animal insect insect insect
原理:
flip each遍历每个分组元组,将(生物列表;分类)转成多个(单个生物;分类)的键值对raze把所有键值对扁平化,拼接成完整的映射字典
更新表的分类列
用生成好的字典更新表,写法更简洁:
update category:mapping[creature] from t
最终表结果:
creature cnt category ------------------------ cat 0 animal dog 1 animal ant 2 insect bee 3 insect wasp 4 insect crocodile 5
如果需要给未匹配的生物设置默认分类,可使用^操作符,例如:
update category:`unknown^mapping[creature] from t
此时crocodile的category会被设为unknown。
内容的提问来源于stack exchange,提问作者wibotwi
相关产品推荐
相关产品推荐

