azure 如何在KQL中的动态数组中找到特定的元素?

bis0qfac  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(102)

如何在KQL中的动态数组中找到特定的元素?
例如,我有json数组(即字符串)[{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}]在KQL中。现在我想找出具有"a"键的对象的val属性的值。它可以是任何索引,而不仅仅是上面示例中的索引1
我找到了array_index_of函数。但它似乎不接受任何 predicate ,它只接受索引,我事先不知道我的例子中的索引。
是否有任何方法可以在JSON数组中查询满足KQL中某些条件的项?
我试过mv-expand,但它似乎将keyval分开:

datatable (b: dynamic)
[
    dynamic({"key": "foo", "val": "bar"}), 
    dynamic({"key": "a", "val": "b"})
]
| mv-expand b

字符串


的数据

tsm1rwdh

tsm1rwdh1#

现在,我想找出具有"a"键的对象的属性val的值。
我已经在我的环境中重现了,以下是预期结果:
您可以使用**bag_unpack()**然后获得如下所示的值:

datatable (b: dynamic)
[
    dynamic({"key": "foo", "val": "bar"}), 
    dynamic({"key": "a", "val": "b"})
]
|evaluate bag_unpack(b)
| where key contains "a"

字符串
x1c 0d1x的数据

Output:



Fiddle的数据。
你知道为什么在我上面的例子中,它会把一个动态分成两部分吗?例如,键foo和瓦尔bar位于不同的行中。
mv-exapnd基于逗号“,”和新行划分动态数组,因此它像这样划分,这是预期的行为。

jei2mxaa

jei2mxaa2#

在KQL中,可以使用mv-expand运算符处理动态数组,然后使用mv-apply运算符根据条件过滤元素。在你的例子中,为了找到'var'的值,关键字为'a',你需要在以下区域中找到一些东西:

datatable jsonString string
[
    '{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}',
    '{"key": "x", "val": "y"}, {"key": "a", "val": "z"}'
]
| mv-apply parsedJson = parse_json(jsonString) on (
    project key = tostring(parsedJson['key']), val = tostring(parsedJson['val'])
)
| where key == "a"
| project val

字符串

**mv-apply parsedJson = parse_json(jsonString)on(...)**parse_json函数用于将jsonString列中的JSON字符串转换为对象。然后使用mv-apply操作符将此解析应用于datatable的每一行,创建具有提取值的新列“key”和“瓦尔”。
**where key ==“a”**这将过滤行,仅保留“key”为“a”的行

执行查询后,您将得到一个表,其中包含带有“a”键的对象的值
编辑:要在同一行上获取key和瓦尔,可以在project语句中使用mv-apply运算符。这将允许您对动态数组的每个元素应用投影,并将属性key和瓦尔合并到一行中。

datatable jsonString string
[
    '{"key": "foo", "val": "bar"}, {"key": "a", "val": "b"}',
    '{"key": "x", "val": "y"}, {"key": "a", "val": "z"}'
]
| mv-apply parsedJson = parse_json(jsonString) on (
    project key = tostring(parsedJson['key']), val = tostring(parsedJson['val'])
)
| where key == "a"
| project key, val


我的示例数据的输出是:

| key | val |
|-----|-----|
| a   | b   |
| a   | z   |

相关问题