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 至少一次,後面接著 BC的串連。

模式數量詞

模式數量詞可用來變更資料流程中模式的對應方式,定義模式必須符合多少次才能有效。 以下是可用的數量詞:

  • '*' - 零次以上
  • '+' - 一或多次
  • '?' – 零或一次
  • '|' - 一個模式或另一個模式

範例︰

PATTERN (A? B+)

此範例會定義 A 0 或 1 次,後面接著 至少一次 B

定義

DEFINE 會指定用來比對模式變數與事件的規則。 這些規則是來自資料流程之匯總值的布林運算式。

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

此範例會定義 A 和 B 的規則AB,其中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,
      ...
    

另請參閱