✅ Azure 串流分析 ✅ 網狀架構事件串流
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預設有一個數據列 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 可讓比對索引鍵,並透過數據行名稱進行分割。 比對將會發生在數據分割語句所指定的每個唯一索引鍵上。 這可讓單一查詢比對所有索引鍵,並產生個別的相符專案,每個索引鍵各一個。
比對之後跳至下一個數據列
這個 skip 子句會定義一旦從事件 S 開始比對模式之後,下一次嘗試比對模式將會從事件 S+1 開始。 在此情況下,相符專案可能會重疊,因為模式可以包含內部另一個模式的開頭。 這是唯一可用的skip子句。
措施
MEASURES 是用來使用匯總方法從比對中定義投影值。 例如,LAST(A.id) AS aid將輸出在符合名為 A 之模式的所有事件上找到的最後id一個值。功能變數名稱 aid。
分類器函式
分類器函式可用於 MEASURE,以輸出與輸入事件相符的模式名稱。 函式會傳回字串清單,每個字串都有符合事件的模式名稱。
模式
此模式會定義要透過數據流搜尋的事件正則表達式。 模式變數是用戶定義的,並以空格分隔。 和 之類的+*修飾詞可用來修改比對事件時變數的頻率。
範例
PATTERN (A+ (B | C))
此範例上的模式會定義至少一次變數 A ,後面接著 B 或 C 的串連。
模式數量值
模式數量值可用來變更數據流中模式的對應方式,並定義模式必須符合多少次才能有效。 下列數量值可供使用:
- '*' - 零次或多次
- '+' - 一或多次
- '?' – 零或一次
- '|' - 一種模式或另一種模式
範例︰
PATTERN (A? B+)
此範例會定義 A 0 或 1 次,後面至少接著 B 一次。
定義
DEFINE 會指定用來比對模式變數與事件的規則。 規則是來自數據流之匯總值的布爾表達式。
DEFINE
A AS Last(A.bigint) > 5,
B AS Last(A.bigint) < B.bigint
此範例會定義規則 A 和 B ,其中 A 的 LAST 值大於 5, 而 B 的 LAST 值為 A 小於目前 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),
...
匯總方法
下列匯總方法可用於 MEASURE 和 DEFINE:
- 最小值 – 到目前為止匯總的最小值。
- Max – 到目前為止匯總的最大數目。
- 第一個 – 匯總的第一個值。
- 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 分鐘內超過 一 倍的 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, ...