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には、一致する一致する出力が既定として 1 行/一致します。これは、使用可能な一致する唯一の出力です。 つまり、一致すると一致ごとに 1 つの行の結果が生成され、一致した行は返されません。
構文
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 を使用すると、一致をキー付けし、列名でパーティション分割できます。 partition ステートメントで指定されたすべての一意のキーに対して一致が発生します。 これにより、すべてのキーに対して 1 つのクエリを照合し、1 対 1 のキーに対して個別の一致を生成できます。
一致後の次の行へのスキップ
この skip 句は、イベント S 以降でパターンが一致すると、次の一致パターンの試行がイベント S+1 から開始されることを定義します。 パターン内に別のパターンの開始を含めることができるので、この場合は一致が重複する可能性があります。 これは、使用可能な唯一のスキップ句です。
対策
MEASURES は、集計メソッドを使用して、一致から予測される値を定義するために使用されます。 たとえば、 は、 LAST(A.id) AS aid
という名前A
のパターンに一致するすべてのイベントで検出された最後id
の値をフィールド名 に出力しますaid
。
分類子関数
MEASURES で分類子関数を使用すると、入力イベントに一致するパターン名を出力できます。 この関数は、イベントに一致したパターン名を持つ文字列のリストを返します。
パターン
パターンは、データ ストリームで検索されるイベントの正規表現を定義します。 パターン変数はユーザー定義であり、スペースで区切られます。 および * などの+修飾子を使用して、イベントの照合時に変数の頻度を変更できます。
例
PATTERN (A+ (B | C))
この例のパターンでは、変数 A を少なくとも 1 回定義し、その後に B または C を連結します。
パターン量指定子
パターン量指定子は、データ ストリームでのパターンのマッピング方法を変更するために使用され、パターンが有効にするために一致する必要がある回数を定義します。 次の量指定子を使用できます。
- '*' - 0 回以上
- '+' - 1 回以上
- '?' – ゼロまたは 1 回
- '|' - 1 つのパターンまたは別のパターン
例:
PATTERN (A? B+)
この例では、 A 0 または 1 回の後に B を少なくとも 1 回定義します。
定義
DEFINE は、パターン変数をイベントに一致させるために使用されるルールを指定します。 ルールは、データ ストリームから集計された値に対するブール式です。
DEFINE
A AS Last(A.bigint) > 5,
B AS Last(A.bigint) < B.bigint
この例では、LAST 値 A が 5 より大きいルール A と B を定義し、Aの LAST 値が B の現在の値より小さい場合は 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 では、次の集計メソッドを使用できます。
- 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
このクエリは 、タンク を満たすイベントに Normal と一致し、3 分以内に 圧力が標準 充填の 2 倍を超える場合は、 危険 なパターンの最大圧力読み取りでイベントが発生するよりも一致します。
制限事項
集計にはフィールド値のみを使用できます。 集計呼び出し内で呼び出すことができる関数はありません。
許可されます。
... DEFINE A AS Max(A.value) > 5, ...
禁止
... DEFINE A AS Max(udf.myUdf(A.value)) > 5, ...
集計関数に入力パラメーターとして指定できるフィールドは 1 つだけです。
許可されます。
... DEFINE A AS Max(A.value) > 5, ...
禁止
... DEFINE A AS Max(A.value1 + A.value2) > 5, ...