다음을 통해 공유


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 일치할 수 있는 유일한 일치 항목인 MATCH당 하나의 행 출력을 기본값으로 사용합니다. 즉, 일치 항목은 일치 항목당 단일 행 결과를 생성하고 일치하는 행을 반환하지 않습니다.

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

기간 제한

제한 기간은 패턴을 검색할 시간 창을 정의하는 데 사용됩니다. 이벤트는 시간별로 정렬되며 SELECT 절에서 TIMESTAMP BY를 사용하여 시간 필드를 지정할 수 있습니다.

PARTITION BY

PARTITION BY를 사용하면 일치 항목을 열 이름으로 키로 지정하고 분할할 수 있습니다. 파티션 문에 지정된 모든 고유 키에 대해 일치가 발생합니다. 이렇게 하면 모든 키에 대해 단일 쿼리를 일치시키고 각 키에 하나씩 별도의 일치 항목을 생성할 수 있습니다.

일치 후 다음 행으로 건너뛰기

이 skip 절은 이벤트 S부터 패턴이 일치하면 다음 일치 시도 패턴이 이벤트 S+1에서 시작되도록 정의합니다. 패턴이 내부에 다른 패턴의 시작을 포함할 수 있으므로 이 경우 일치 항목이 겹칠 수 있습니다. 사용 가능한 유일한 skip 절입니다.

측정

MEASURES는 집계 메서드를 사용하여 일치 항목에서 프로젝스된 값을 정의하는 데 사용됩니다. 예를 들어 는 LAST(A.id) AS aid 라는 패턴 A 과 일치하는 모든 이벤트에 대해 마지막으로 id 찾은 값을 필드 이름 aid로 출력합니다.

분류자 함수

분류자 함수는 MEASURES에서 입력 이벤트와 일치하는 패턴 이름을 출력하는 데 사용할 수 있습니다. 함수는 각각 이벤트와 일치하는 패턴 이름을 가진 문자열 목록을 반환합니다.

PATTERN

패턴은 데이터 스트림을 통해 검색할 이벤트의 정규식을 정의합니다. 패턴 변수는 사용자 정의이며 공백으로 구분됩니다. 및 * 와 같은 + 한정자는 이벤트를 일치시키는 경우 변수의 빈도를 수정하는 데 사용할 수 있습니다.

예제

PATTERN (A+ (B | C))

이 예제의 패턴은 변수 A 를 한 번 이상 정의한 다음 B 또는 C를 연결합니다.

패턴 수량자

패턴 수량자는 패턴이 데이터 스트림에서 매핑되는 방식을 변경하는 데 사용되며, 패턴이 유효하기 위해 일치해야 하는 횟수를 정의합니다. 다음 수량자를 사용할 수 있습니다.

  • '*' - 0회 이상
  • '+' - 한 번 이상
  • '?' – 0회 또는 1회
  • '|' - 한 패턴 또는 다른 패턴

예:

PATTERN (A? B+)

이 예제에서는 A 0 또는 1 시간 뒤에 B 를 한 번 이상 정의합니다.

정의

DEFINE는 패턴 변수를 이벤트에 일치시킬 때 사용되는 규칙을 지정합니다. 규칙은 데이터 스트림에서 집계된 값에 대한 부울 식입니다.

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

이 예제에서는 규칙 AB 를 정의합니다. 여기서 LAST 값 A 는 5보다 크고 , BA 의 LAST 값이 B의 현재 값보다 작습니다. DEFINE 식에서 집계 함수를 사용하지 않는 경우 평가되는 현재 이벤트는 패턴 변수에 바인딩됩니다(예: B.bigint 에서 B 값은 평가 중인 현재 이벤트에서 가져옵니다.).

패턴 A 가 패턴 B 앞에 정의된 경우에만 정의된 패턴에 순서대로 액세스할 수 있습니다. AB를 참조할 수 없습니다.

허용

...
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에서 사용할 수 있습니다.

  • 최소 – 지금까지 집계된 최소 수입니다.
  • 최대 – 지금까지 집계된 최대 수입니다.
  • 첫 번째 – 집계된 첫 번째 값입니다.
  • 마지막 – 지금까지 집계된 마지막 값입니다.

예:

고압 탱크를 리필하는 것은 위험한 과정이며 탱크의 압력 증가로 인해 온도가 높아지고, 재충전하는 동안 탱크가 냉각될 시간을 주기 위해 압력이 꾸준히 증가해야 하므로 면밀히 모니터링해야 합니다.

이 예제에서 개발자는 압력이 증가하기 시작할 때 고압 탱크의 리필을 모니터링하려고 합니다. 탱크는 리필을 시작하고 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

이 쿼리는 Normal 을 탱크를 채우는 모든 이벤트와 일치하며, 3분 이내에 압력이 Normal 채우기의 두 배 이상인 경우 위험한 패턴에 대한 최대 압력 판독값으로 이벤트가 발생합니다.

제한 사항

  • 필드 값만 집계에 사용할 수 있습니다. 집계 호출 내에서 함수를 호출할 수 없습니다.

    허용

    ...
    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,
      ...
    

추가 정보