Partilhar via


MATCH_RECOGNIZE (Stream Analytics)

A cláusula MATCH_RECOGNIZE é utilizada para procurar um conjunto de eventos num fluxo de dados. Esta cláusula permite-lhe definir padrões de eventos com expressões regulares e métodos de agregação para verificar e extrair valores da correspondência.

O exemplo seguinte mostra a estrutura básica de uma cláusula de 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 tem uma saída correspondente de UMA LINHA POR CORRESP como predefinição, que é a única correspondência disponível. Isto significa que a correspondência produz um único resultado de linha por correspondência e não devolve as linhas correspondentes.

Syntax

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> ::=
{
	* | + | ?
}

DURAÇÃO DO LIMITE

A duração do limite é utilizada para definir uma janela de tempo para que o padrão seja pesquisado. Os eventos são ordenados por hora e TIMESTAMP BY podem ser utilizados na cláusula SELECT para especificar o campo de tempo.

PARTIÇÃO POR

PARTIÇÃO POR permite que a correspondência seja com chave e particionada por um nome de coluna. Ocorrerá uma correspondência em cada chave exclusiva especificada pela instrução de partição. Isto permite que uma única consulta seja correspondida em todas as chaves e gere correspondências separadas, uma para cada chave.

DEPOIS DA CORRESPONDÊNCIA, AVANCE PARA A LINHA SEGUINTE

Esta cláusula de ignorar define que assim que um padrão for correspondido a partir do evento S, a próxima tentativa de corresponder ao padrão começará no evento S+1. Neste caso, as correspondências podem sobrepor-se, uma vez que um padrão pode conter o início de outro padrão no interior. Esta é a única cláusula de ignorar disponível.

MEDIDAS

AS MEDIDAS são utilizadas para definir os valores projetados da correspondência através de métodos agregados. Por exemplo, LAST(A.id) AS aid irá exportar o último id valor que foi encontrado em todos os eventos que correspondiam ao padrão nomeado A no nome aiddo campo .

Função Classificador

A função classificador pode ser utilizada em MEDIDAS para exportar nomes de padrões correspondentes a eventos de entrada. A função devolve uma lista de cadeias, cada uma com o nome do padrão que corresponde a um evento.

PADRÃO

O padrão define a expressão regular de eventos a serem pesquisados no fluxo de dados. As variáveis de padrão são definidas pelo utilizador e separadas por espaços. Modificadores como + e * podem ser utilizados para modificar a frequência de uma variável ao combinar eventos.

Exemplo

PATTERN (A+ (B | C))

O padrão neste exemplo define uma variável A pelo menos uma vez, seguida de uma concatenação de B ou C.

Quantificadores de Padrões

Os quantificadores de padrões são utilizados para alterar a forma como um padrão é mapeado no fluxo de dados, definindo quantas vezes um padrão precisa de corresponder para ser válido. Estão disponíveis os seguintes quantificadores:

  • '*' - Zero ou mais vezes
  • '+' - Uma ou mais vezes
  • '?' – Zero ou uma vez
  • '|' - Um padrão ou outro

Exemplo:

PATTERN (A? B+)

Este exemplo define uma hora A 0 ou 1 seguida de B , pelo menos, uma vez.

DEFINIR

DEFINE especifica as regras utilizadas para corresponder uma variável de padrão a um evento. As regras são Expressões booleanas sobre valores agregados do fluxo de dados.

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

Este exemplo define as regras A e B em que o ÚLTIMO valor de A é maior do que 5 e B em que o último valor de A é menor do que o valor atual de B. Quando não utiliza uma função de agregação na expressão DEFINE, o evento atual que está a ser avaliado vincula-se à variável de padrão, por exemplo, em B.bigint o valor B provém do evento atual que está a ser avaliado.

Os padrões definidos só podem ser acedidos por ordem, se o padrão A for definido antes do padrão B, A não pode referenciar B.

Permitido

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

Não permitido

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

Métodos de Agregação

Os seguintes métodos agregados podem ser utilizados em MEDIDAS e DEFINIR:

  • Min – o número mínimo agregado até agora.
  • Max – o número máximo agregado até agora.
  • Primeiro – o primeiro valor agregado.
  • Last – o último valor agregado até agora.

Exemplo:

Reabastecer tanques de alta pressão é um processo perigoso e precisa de ser monitorizado de perto, uma vez que o aumento da pressão sobre um tanque também aumenta a sua temperatura, a pressão precisa de aumentar constantemente para dar tempo para o tanque arrefecer enquanto reabastece.

Neste exemplo, o programador quer monitorizar o reenchimento de um tanque de alta pressão à medida que começa a aumentar a pressão. O tanque começa a encher novamente e não pode aumentar a pressão pelo seu duplo em menos de 3 minutos, caso contrário o tanque sobreaquece e pode causar uma falha catastrófica.

A seguinte consulta pode ser utilizada para monitorizar o progresso:

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

Esta consulta corresponde a Normal a qualquer evento que esteja a encher o tanque e, no caso de a pressão ser superior ao dobro de um preenchimento Normal em 3 minutos, do que um evento é acionado com a leitura de pressão máxima para o padrão Perigoso .

Limitações

  • Apenas os valores de campo podem ser utilizados para agregações. Não é possível chamar funções dentro de uma chamada de agregação.

    Permitido

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

    Não permitido

    ...
    DEFINE
          A AS Max(udf.myUdf(A.value)) > 5,
    ...
    
  • Apenas um único campo pode ser fornecido a uma função de agregação como parâmetro de entrada.

    Permitido

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

    Não permitido

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

Ver também