KQL中如何将数值直接转换为dynamic类型?解决类型不匹配问题
在ADX中将指定数值转换为对应类型的dynamic值
已知在ADX中执行如下查询时,打包后的dynamic值里所有数值均为real类型:
datatable( id: int, label: string, value: real )[ 1, 'x', 1.0, 1, 'y', 1.1, ] | extend bag = bag_pack(label, value) | summarize make_bag(bag) by id
返回的bag_bag为{"x":1.0,"y":1.1}(可通过追加| extend dynamic_to_json(bag_bag)查看原始类型)。
需要将label为"x"的value转换为int类型后再打包,但直接使用iff()会因类型不匹配报错,使用todynamic()(已弃用的parse_json()别名)也因参数类型要求无法实现。
方案1:通过parse_json()结合字符串转换实现
利用parse_json()可将字符串解析为对应类型dynamic值的特性,先将数值转为字符串再解析:
datatable( id: int, label: string, value: real )[ 1, 'x', 1.0, 1, 'y', 1.1, ] | extend bag = bag_pack( label, parse_json( iff( label == "x", tostring(toint(value)), // 将x的value转为int后再转字符串 tostring(value) // 其他value直接转字符串 ) ) ) | summarize make_bag(bag) by id | extend dynamic_to_json(bag_bag) // 查看最终dynamic的原始JSON格式
执行后dynamic_to_json(bag_bag)会返回{"x":1,"y":1.1},其中"x"对应的值为int类型,"y"为real类型。
方案2:拆分处理后合并Bag
将x和其他标签的Bag分开构造,再合并为最终Bag:
datatable( id: int, label: string, value: real )[ 1, 'x', 1.0, 1, 'y', 1.1, ] | extend x_bag = iff(label == "x", bag_pack(label, toint(value)), dynamic({})), other_bag = iff(label != "x", bag_pack(label, value), dynamic({})) | summarize x_combined = make_bag(x_bag), other_combined = make_bag(other_bag) by id | extend bag_bag = bag_merge(x_combined, other_combined) | extend dynamic_to_json(bag_bag)
此方法通过分别构造不同类型的Bag,再用bag_merge()合并,同样能得到{"x":1,"y":1.1}的结果。
内容的提问来源于stack exchange,提问作者Peter Vandivier
相关产品推荐
相关产品推荐

