Поделиться через


Оператор parse-where

Область применения: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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 , sliceNumbertotalSlices, lockTime, , , MonthreleaseTimepreviousLockTimeи .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