Оператор parse-kv
Область применения: ✅Microsoft Fabric✅✅
Извлекает структурированные сведения из строкового выражения и представляет сведения в форме key/value.
Поддерживаются следующие режимы извлечения:
- Указанный разделитель: извлечение на основе указанных разделителей, которые определяют, как ключи и значения и пары отделены друг от друга.
- не указанного разделителя: извлечение без необходимости указывать разделители. Любой неэлементный символ считается разделителем.
- Regex: извлечение на основе регулярных выражений.
Синтаксис
Указанный разделитель
Tkv_delimiter
=
[ ,
quote
=
QuoteChars ... [,
escape
=
EscapeChar ...]] [ ],
greedy
=
true
)
Неопределенный разделитель
with
(
[ quote
=
кавычки ... [,
escape
=
EscapeChar ...]])
Регулярное выражение
|
parse-kv
as
(
KeyList)
with
(
regex
=
RegexPattern)
)
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
Выражение | string |
✔️ | Выражение, из которого необходимо извлечь значения ключей. |
KeyList | string |
✔️ | Разделенный запятыми список имен ключей и их типов данных значений. Порядок ключей не должен соответствовать порядку, в котором они отображаются в тексте. |
PairDelimiter | string |
Разделитель, разделитель, разделяющий пары значений ключей друг от друга. | |
KvDelimiter | string |
Разделитель, который отделяет ключи от значений. | |
Кавычки | string |
Одно-или двухзначный строковый литерал, представляющий открывающие и закрывающие кавычки, с которыми может быть заключено имя ключа или извлеченное значение. Параметр может повторяться, чтобы указать отдельный набор открывающих и закрывающих кавычки. | |
EscapeChar | string |
Однозначный строковый литерал, описывающий символ, который может использоваться для экранирования специальных символов в кавычках. Параметр может повторяться, если используются несколько escape-символов. | |
RegexPattern | string |
Регулярное выражение , содержащее две группы записи точно. Первая группа представляет имя ключа, а вторая группа представляет значение ключа. |
Возвраты
Исходное табличное выражение ввода T, расширенное столбцами на указанные ключи для извлечения.
Примечание.
- Если ключ не отображается в записи, соответствующее значение столбца равно
null
или пустой строке в зависимости от типа столбца. - Извлекаются только ключи, перечисленные в операторе.
- Первый вид ключа извлекается, а последующие значения игнорируются.
- При извлечении ключей и значений начальные и конечные пробелы игнорируются.
Примеры
В примерах этого раздела показано, как использовать синтаксис для начала работы.
Извлечение с четко определенными разделителями
В этом запросе ключи и значения разделены четко определенными разделителями. Эти делиметры являются символами запятых и двоеточий.
print str="ThreadId:458745723, Machine:Node001, Text: The service is up, Level: Info"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (pair_delimiter=',', kv_delimiter=':')
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Служба выполняется | 458745723 | Node001 |
Извлечение с кавычением значений
Иногда имена ключей или значения упаковываются в кавычки, что позволяет самим значениям содержать символы разделителя. В следующих примерах показано, как quote
аргумент используется для извлечения таких значений.
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="connection aborted" "event time"=2021-01-01T10:00:54'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"')
| project-away str
Выходные данные
время события. | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | прервано подключение |
Этот запрос использует различные кавычки открытия и закрытия:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure=(connection aborted) (event time)=(2021-01-01 10:00:54)'
| parse-kv str as (['event time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='()')
| project-away str
Выходные данные
время события. | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | прервано подключение |
Сами значения могут содержать правильно экранированные символы кавычки, как показано в следующем примере:
print str='src=10.1.1.123 dst=10.1.1.124 bytes=125 failure="the remote host sent \\"bye!\\"" time=2021-01-01T10:00:54'
| parse-kv str as (['time']:datetime, src:string, dst:string, bytes:long, failure:string) with (pair_delimiter=' ', kv_delimiter='=', quote='"', escape='\\')
| project-away str
Выходные данные
Время | src | dst | байт | сбой, |
---|---|---|---|---|
2021-01-01 10:00:54.0000000 | 10.1.1.123 | 10.1.1.124 | 125 | удаленный узел отправил "bye!" |
Извлечение в жадном режиме
Существуют случаи, когда неквотируемые значения могут содержать разделители пар. В этом случае используйте greedy
режим, чтобы указать оператору, чтобы проверить до следующего внешнего вида ключа (или конца строки) при поиске окончания значения.
В следующих примерах сравнивается работа оператора с заданным режимом и без нее greedy
.
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=')
| project-away str
Выходные данные
name | phone | city |
---|---|---|
Джон | 555 | Новый |
print str='name=John Doe phone=555 5555 city=New York'
| parse-kv str as (name:string, phone:string, city:string) with (pair_delimiter=' ', kv_delimiter='=', greedy=true)
| project-away str
Выходные данные
name | phone | city |
---|---|---|
Александр Демидов | 555 5555 | Нью-Йорк |
Извлечение без четко определенных разделителей
В следующем примере любой нефанумерный символ считается допустимым разделителем:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: Started"
| parse-kv str as (Text: string, ThreadId:long, Machine: string)
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Запуск | 458745723 | Node001 |
В этом режиме разрешены кавыки и экранирование значений, как показано в следующем примере:
print str="2021-01-01T10:00:34 [INFO] ThreadId:458745723, Machine:Node001, Text: 'The service \\' is up'"
| parse-kv str as (Text: string, ThreadId:long, Machine: string) with (quote="'", escape='\\')
| project-away str
Выходные данные
Текст | ThreadId | Компьютер |
---|---|---|
Служба " работает | 458745723 | Node001 |
Извлечение с помощью regex
Если разделители не определяют структуру текста достаточно, извлечение на основе регулярных выражений может оказаться полезным.
print str=@'["referer url: https://hostname.com/redirect?dest=/?h=1234", "request url: https://hostname.com/?h=1234", "advertiser id: 24fefbca-cf27-4d62-a623-249c2ad30c73"]'
| parse-kv str as (['referer url']:string, ['request url']:string, ['advertiser id']: guid) with (regex=@'"([\w ]+)\s*:\s*([^"]*)"')
| project-away str
Выходные данные
URL-адрес ссылки на ссылку | URL-адрес запроса | идентификатор рекламодателя |
---|---|---|
https://hostname.com/redirect?dest=/?h=1234 |
https://hostname.com/?h=1234 |
24fefbca-cf27-4d62-a623-249c2ad30c73 |