Оператор parse-where
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Вычисляет строковое выражение и анализирует его значение в одном или нескольких вычисляемых столбцах. Результатом являются только успешно проанализированные строки.
parse-where
анализирует строки так же, как синтаксический анализ, и фильтрует строки, которые не были успешно проанализированы.
См . оператор синтаксического анализа, который создает значения NULL для неудачно проанализированных строк.
Синтаксис
Выражение T | parse-where
[kind=
kind [flags=
regexFlags]] with
*
(stringConstant columnName [:
columnType]) ... *
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
T | string |
✔️ | Табличные входные данные для синтаксического анализа. |
kind | string |
✔️ | Одно из поддерживаемых значений типа. Значение по умолчанию — simple . |
regexFlags | string |
Если тип имеет regex вид, то можно указать флаги regex, которые будут использоваться как U для непрогрежденных, m для многострочный режим, s для соответствия новой строке \n и i для без учета регистра. Дополнительные флаги можно найти в флагах. |
|
выражение | string |
✔️ | Выражение, результатом которого является строка. |
stringConstant | string |
✔️ | Строковая константа, для которой выполняется поиск и анализ. |
columnName | string |
✔️ | Имя столбца, которому назначается значение. Извлекается из строкового выражения. |
columnType | string |
Скалярное значение, указывающее тип, в который необходимо преобразовать значение. Значение по умолчанию — string . |
Примечание.
- Используйте проект , если вы также хотите удалить или переименовать некоторые столбцы.
- Используйте
*
шаблон для пропуска нежелательных значений. Это значение нельзя использовать послеstring
столбца. - Шаблон синтаксического анализа может начинаться с ColumnName в дополнение к StringConstant.
- Если проанализированное выражение не является типом
string
, оно будет преобразовано в типstring
.
Поддерживаемые значения типа
Текст | Description |
---|---|
simple |
Это значение по умолчанию. stringConstant — это обычное строковое значение, и совпадение строго. Все строковые разделители должны присутствовать в проанализированной строке, и все расширенные столбцы должны соответствовать требуемым типам. |
regex |
stringConstant может быть регулярным выражением, и совпадение строго. Все строковые разделители, которые могут быть регулярными выражениями при использовании этого режима, должны присутствовать в проанализированной строке, и все расширенные столбцы должны соответствовать требуемым типам. |
Режим регулярных выражений
В режиме регулярных выражений синтаксический анализ преобразует шаблон в regex и использует регулярные выражения для выполнения сопоставления с использованием нумерованных записных групп, которые обрабатываются внутренне. Например:
parse-where kind=regex Col with * <regex1> var1:string <regex2> var2:long
Регулярное выражение, которое будет создано внутренним .*?<regex1>(.*?)<regex2>(\-\d+)
анализом.
*
преобразовано в.*?
.string
преобразовано в.*?
.long
преобразовано в\-\d+
.
Возвраты
Входная таблица, которая расширяется в соответствии со списком столбцов, предоставляемых оператору.
Примечание.
Только успешно проанализированные строки будут находиться в выходных данных. Строки, которые не соответствуют шаблону, будут отфильтрованы.
Примеры
Оператор parse-where
предоставляет упрощенный способ использования extend
для таблицы путем применения нескольких операторов extract
в одном выражении string
. Это наиболее полезно, если в таблице есть string
столбец, содержащий несколько значений, которые необходимо разбить на отдельные столбцы. Например, можно разбить столбец, созданный инструкцией трассировки разработчика ("printf
/"Console.WriteLine
").
С использованием parse
В приведенном ниже примере столбец EventText
таблицы Traces
содержит строки формы Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})
. Следующая операция расширяет таблицу с шестью столбцами: resourceName
, sliceNumber
totalSlices
, lockTime
, , , Month
releaseTime
previousLockTime
и .Day
Несколько строк не имеют полного совпадения.
При использовании parse
вычисляемые столбцы будут иметь значения NULL.
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previouLockTime: date ")" *
| project
resourceName,
totalSlices,
sliceNumber,
lockTime,
releaseTime,
previouLockTime
Выходные данные
resourceName | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 20 | 02/17/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
С использованием parse-where
При использовании "синтаксического анализа" отфильтруются неудачно проанализированные строки из результата.
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *
| project
resourceName,
totalSlices,
sliceNumber,
lockTime,
releaseTime,
previousLockTime
Выходные данные
resourceName | totalSlices | sliceNumber | lockTime | releaseTime | previousLockTime |
---|---|---|---|---|---|
PipelineScheduler | 27 | 20 | 02/17/2016 08:40:01 | 2016-02-17 08:40:01.0000000 | 2016-02-17 08:39:01.0000000 |
PipelineScheduler | 27 | 22 | 02/17/2016 08:41:01 | 2016-02-17 08:41:00.0000000 | 2016-02-17 08:40:01.0000000 |
Режим regex с помощью флагов regex
Чтобы получить имя ресурса и totalSlices, используйте следующий запрос:
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices
Выходные данные
resourceName | totalSlices |
---|---|
parse-where
с флагом регрессии без учета регистра
В приведенном выше запросе режим по умолчанию учитывает регистр, поэтому строки были успешно проанализированы. Результат не получен.
Чтобы получить необходимый результат, запустите parse-where
с флагом регистра без учета регистра (i
) regex.
Только три строки будут успешно проанализированы, поэтому результат — три записи (некоторые итоговые данные содержат недопустимые целые числа).
let Traces = datatable(EventText: string)
[
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
"Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex flags=i EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices
Выходные данные
resourceName | totalSlices |
---|---|
PipelineScheduler | 27 |
PipelineScheduler | 27 |
PipelineScheduler | 27 |