MATCH_RECOGNIZE (串流分析)
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 的相符輸出作為預設值,這是唯一可用的比對。 這表示比對會產生每個相符專案的單一資料列結果,而且不會傳回相符的資料列。
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
將會輸出在符合名為 之模式的所有事件上找到的最後 id
一個值,並輸入 A
功能變數名稱 aid
。
分類函式
分類函數可用於 MEASURES,以輸出與輸入事件相符的模式名稱。 函式會傳回字串清單,每個字串都有符合事件的模式名稱。
PATTERN
模式會定義要透過資料流程搜尋之事件的正則運算式。 模式變數是使用者定義的,並以空格分隔。 和 * 之類的 + 修飾詞可用來修改比對事件時的變數頻率。
範例
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和B,其中A的 LAST 值大於 5,而B的 LAST 值小於B目前的值。當未在 DEFINE 運算式上使用彙總函式時,正在評估的目前事件會系結至模式變數,例如,在B.Bigint上,B值來自正在評估的目前事件。
如果模式 A 是在模式 B之前定義,則只能依序存取已定義的模式 A,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:
- 最小值 – 到目前為止匯總的最小數目。
- 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 分鐘內一 般填滿 的兩倍,就會引發事件,並產生 危險 模式的最大壓力讀數。
限制
只有域值可以用於匯總。 在匯總呼叫內無法呼叫任何函式。
允許
... 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, ...