如何解析含未知键值对的字符串并生成动态Bag?
动态解析未知键值对到Bag的方法
假设你有一列Column1,里面存的是key1=value1, key2=value2,...这种格式的键值对,而且你既不知道键的名字,也不确定有多少个键值对,要把这些内容解析出来,打包成一个Bag类型的列(比如Bag1),比如把Column1: 'key1=value1, key2=value2'转成Bag1: { "key1": "value1", "key2": "value2" }。
用Kusto的话,不用依赖需要固定键名的parse运算符,按下面的步骤来:
完整查询示例
// 模拟测试数据 datatable(Column1:string) [ 'key1=value1, key2=value2', 'foo=bar, baz=qux, xyz=123' ] // 1. 把整串键值对拆成单个条目数组 | extend KeyValuePairs = split(Column1, ', ') // 2. 把数组展开成每行一个键值对 | mv-expand KeyValuePairs to typeof(string) // 3. 自动解析每个键值对,提取键和值 | parse kv KeyValuePairs into Key, Value // 4. 把同一原始行的键值对打包成Bag,聚合回原行 | summarize Bag1 = bag_pack(Key, Value) by Column1
步骤说明
split(Column1, ', '):按,把Column1的字符串拆成单个键值对组成的数组mv-expand KeyValuePairs:把数组展开,让每个键值对单独占一行parse kv KeyValuePairs into Key, Value:这个运算符专门用来解析key=value格式的字符串,不用提前知道键名,自动把键和值提取到Key和Value列里summarize Bag1 = bag_pack(Key, Value) by Column1:把同一原始行的所有键值对打包成一个Bag,再按原始的Column1聚合回去,恢复成一行对应一个Bag的格式
注意事项
- 如果键值对之间的分隔符不是
,(比如只有逗号没有空格,或者空格数量不固定),可以先拆分再去空格:把split(Column1, ',')后面加一步| extend KeyValuePairs = trim(' ', KeyValuePairs) - 如果值本身包含逗号,这种简单拆分的方法会出错,需要更复杂的逻辑处理,但如果是常规的键值对格式(值不含逗号),上面的方法完全够用
内容的提问来源于stack exchange,提问作者Matthias Güntert
相关产品推荐
相关产品推荐

