MATCH_RECOGNIZE (Stream Analytics)

Предложение MATCH_RECOGNIZE используется для поиска набора событий в потоке данных. Это предложение позволяет определять шаблоны событий с помощью регулярных выражений и агрегированных методов для проверки и извлечения значений из совпадения.

В следующем примере показана базовая структура предложения MATCH_RECOGNIZE:

SELECT *
INTO output FROM input TIMESTAMP BY time
	MATCH_RECOGNIZE (
		LIMIT DURATION (minute, 1)
		PARTITION BY tollBoothId
		MEASURES
			Last(Toyota.LicensePlate) AS toyotaLicensePlate,
			Last(Lexus.LicensePlate) AS lexusLicensePlate
		AFTER MATCH SKIP TO NEXT ROW
		PATTERN (Toyota+ Ford* Lexus+)
		DEFINE
			Toyota AS Toyota.make = 'Toyota',
			Ford AS Ford.make = 'Ford',
			Lexus AS Lexus.make = 'Lexus'
	) AS T

MATCH_RECOGNIZE по умолчанию имеет совпадающие выходные данные ONE ROW PER MATCH, что является единственным доступным сопоставлением. Это означает, что совпадение создает один результат строки для каждого совпадения и не возвращает совпадающие строки.

Синтаксис

SELECT_star_query_definition
MATCH_RECOGNIZE (
	LIMIT DURATION (time_unit, time)
	PARTITION BY column_alias
	MEASURES
		expression AS column_alias [,...n]
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN ( <pattern_group> )
	DEFINE
		pattern_name AS boolean_expression [,…n]
) AS column_alias

<pattern_group> ::=
{
	<pattern_name_modifier> [ | <pattern_group> ]*
}
<pattern_name_modifier> ::=
{
	<pattern_atom> [ <pattern_atom> ]*
}
<pattern_atom> ::=
{
	[ pattern_name | ( <pattern_group> ) ] [ <pattern_modifier> ]?
}
<pattern_name> :: =
{
	name | .
}
<pattern_modifier> ::=
{
	* | + | ?
}

ОГРАНИЧЕНИЕ ДЛИТЕЛЬНОСТИ

Предельная длительность используется для определения периода времени для шаблона для поиска. События упорядочены по времени, а timeSTAMP BY можно использовать в предложении SELECT для указания поля времени.

PARTITION BY

PARTITION BY позволяет использовать ключ к совпадению и секционировать его по имени столбца. Совпадение будет происходить для каждого уникального ключа, указанного инструкцией partition. Это позволяет сопоставить один запрос по всем ключам и создать отдельные совпадения, по одному к каждому ключу.

ПОСЛЕ СОВПАДЕНИЯ ПЕРЕЙТИ К СЛЕДУЮЩЕЙ СТРОКЕ

Это предложение skip определяет, что после сопоставления шаблона, начиная с события S, следующая попытка сопоставления шаблона начнется в событии S+1. Совпадения в этом случае могут перекрываться, так как шаблон может содержать начало другого шаблона внутри. Это единственное доступное предложение skip.

МЕРЫ

MEASURES используется для определения проецируемых значений из сопоставления с помощью агрегированных методов. Например, LAST(A.id) AS aid выдаст последнее id значение, которое было найдено во всех событиях, которые соответствуют шаблону с именем A поля aid.

Функция-классификатор

Функция-классификатор может использоваться в MEASURES для вывода имен шаблонов, соответствующих входным событиям. Функция возвращает список строк, каждая из которых содержит имя шаблона, соответствующее событию.

PATTERN

Шаблон определяет регулярное выражение событий для поиска в потоке данных. Переменные шаблона определяются пользователем и разделяются пробелами. Модификаторы, такие как + и * , можно использовать для изменения частоты переменной при сопоставлении событий.

Пример

PATTERN (A+ (B | C))

Шаблон в этом примере определяет переменную A по крайней мере один раз, за которой следует объединение B или C.

Квантификаторы шаблона

Квантификаторы шаблонов используются для изменения способа сопоставления шаблона в потоке данных, определяя, сколько раз шаблон должен соответствовать, чтобы быть допустимым. Доступны следующие квантификаторы:

  • "*" — ноль или более раз
  • "+" — один или несколько раз
  • '?' — ноль или один раз
  • '|' — тот или иной шаблон

Пример.

PATTERN (A? B+)

В этом примере определяется A 0 или 1 раз, за которым следует B по крайней мере один раз.

DEFINE

DEFINE задает правила, используемые для сопоставления переменной шаблона с событием. Правила представляют собой логические выражения для агрегированных значений из потока данных.

DEFINE
    A AS Last(A.bigint) > 5,
    B AS Last(A.bigint) < B.bigint

В этом примере определяются правила A и B , где последнее значение A больше 5 и B , где последнее значение A меньше текущего значения B. Если агрегатная функция не используется в выражении DEFINE, текущее вычисляемое событие привязывается к переменной шаблона, например для B.bigint значение B исходит из текущего вычисляемого события.

К определенным шаблонам можно обращаться только по порядку, если шаблон A определен до шаблона B, A не может ссылаться на Б.

Допускается

...
DEFINE
A AS Last(A.value),
B AS Max(A.value) + Max(B.value),
...

Не разрешено

...
DEFINE
A AS Last(A.value) + Last(B.Value),
B AS Max(A.value) + Max(B.value),
...

Методы статистической обработки

В функциях MEASURES и DEFINE можно использовать следующие статистические методы:

  • Min — минимальное число, агрегированное на данный момент.
  • Max — максимальное число, агрегированное на данный момент.
  • First — первое агрегированное значение.
  • Last — последнее агрегированное значение.

Пример.

Заполнение резервуаров высокого давления является опасным процессом, и необходимо тщательно отслеживать, как увеличение давления на бак также увеличивает его температуру, давление должно постоянно увеличиваться, чтобы дать время для охлаждения бака во время заправки.

В этом примере разработчик хочет отслеживать заполнение бака высокого давления, когда он начинает увеличивать давление. Бак начинает заправку и не может увеличить давление в два раза менее чем за 3 минуты, в противном случае бак перегревается и может привести к катастрофическому отказу.

Для отслеживания хода выполнения можно использовать следующий запрос:

SELECT *
INTO output FROM input TIMESTAMP BY time
MATCH_RECOGNIZE (
	LIMIT DURATION (minute, 3)
	MEASURES
 		MAX(Dangerous.pressure) as pressure,
		Classifier() as patterns
	AFTER MATCH SKIP TO NEXT ROW
	PATTERN (Normal+ Dangerous+)
	DEFINE
		Normal AS Normal.isFilling = 1,
		Dangerous AS Max(Dangerous.pressure) > 2* Max(Normal.pressure)
) AS T

Этот запрос соответствует обычному событию, которое заполняет бак, и в случае, если давление в течение 3 минут превышает нормальное , чем событие инициируется с максимальным значением давления для шаблона Dangerous .

Ограничения

  • Для статистических выражений можно использовать только значения полей. Никакие функции не могут вызываться в статистическом вызове.

    Допускается

    ...
    DEFINE
          A AS Max(A.value) > 5,
    ...
    

    Не разрешено

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • В качестве входного параметра агрегатной функции может быть предоставлено только одно поле.

    Допускается

    ...
        DEFINE
      	    A AS Max(A.value) > 5,
      ...    
    

    Не разрешено

      ...
      DEFINE
          A AS Max(A.value1 + A.value2) > 5,
      ...
    

См. также раздел