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
이 예제에서는 규칙 A 와 B 를 정의합니다. 여기서 LAST 값 A 는 5보다 크고 , B 는 A 의 LAST 값이 B의 현재 값보다 작습니다. DEFINE 식에서 집계 함수를 사용하지 않는 경우 평가되는 현재 이벤트는 패턴 변수에 바인딩됩니다(예: B.bigint 에서 B 값은 평가 중인 현재 이벤트에서 가져옵니다.).
패턴 A 가 패턴 B 앞에 정의된 경우에만 정의된 패턴에 순서대로 액세스할 수 있습니다. A 는 B를 참조할 수 없습니다.
허용
...
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, ...