複合イベント処理 (CEP) 文として、MATCH_RECOGNIZE を使用して、入力データストリームから指定されたルールに準拠するイベントを識別し、指定された方法で出力イベントを生成します。
構文
SELECT [ ALL | DISTINCT ]
{ * | projectItem [, projectItem ]* }
FROM tableExpression
[MATCH_RECOGNIZE (
[PARTITION BY {partitionItem [, partitionItem]*}]
[ORDER BY {orderItem [, orderItem]*}]
[MEASURES {measureItem AS col [, measureItem AS col]*}]
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS]
[AFTER MATCH SKIP]
PATTERN (patternVariable[quantifier] [ patternVariable[quantifier]]*) WITHIN intervalExpression
DEFINE {patternVariable AS patternDefinationExpression [, patternVariable AS patternDefinationExpression]*}
)];
名称 | 説明 |
---|---|
PARTITION BY | パーティション化に使用される列。 このパラメーターは省略可能です。 |
ORDER BY | ソートに使用される列。 複数の条件を指定することができます。 ただし、ソートに使用される最初の列は、EVENT TIME 列または PROCESS TIME 列でなければなりません。 このパラメーターは省略可能です。
|
MEASURES | 一致に成功した入力イベントに基づいて出力イベントを構築する方法。 |
ONE ROW PER MATCH | 一致に成功するたびに 1 つの出力イベントのみが生成されることを指定します。 |
ONE ROW PER MATCH WITH TIMEOUT ROWS | 一致に成功またはタイムアウトするたびに出力イベントが生成されることを指定します。 タイムアウト間隔は、PATTERN 文の WITHIN 文によって定義されます。
|
ALL ROW PER MATCH | 一致に成功するたびに、入力イベントごとに出力イベントが生成されることを指定します。 |
ALL ROW PER MATCH WITH TIMEOUT ROWS | 一致に成功するかタイムアウトするたびに、入力イベントごとに出力イベントが生成されることを指定します。 タイムアウト間隔は、PATTERN 文の WITHIN 文によって定義されます。
|
[ONE ROW PER MATCH|ALL ROWS PER MATCH|ONE ROW PER MATCH WITH TIMEOUT ROWS|ALL ROWS PER MATCH WITH TIMEOUT ROWS] | このパラメーターは省略可能です。 デフォルト値は ONE ROW PER MATCH です。
|
AFTER MATCH SKIP TO NEXT ROW | 成功した一致に続く次の一致が、成功した一連のイベントのうち最初のイベントに続く次のイベントから始まることを指定します。 |
AFTER MATCH SKIP PAST LAST ROW | 一致に成功した一連のイベントのうち最後のイベントに続く次のイベントから、成功した一致に続く次の一致が始まることを指定します。 |
AFTER MATCH SKIP TO FIRST patternItem | 成功した一致に続く次の一致が、一致に成功したイベントのシーケンスの patternItem に対応する最初のイベントから始まることを指定します。 |
AFTER MATCH SKIP TO LAST patternItem | 成功した一致に続く次の一致が、一致に成功した一連のイベントの patternItem に対応する最後のイベントから始まることを指定します。 |
PATTERN | 識別されるイベントのシーケンスが準拠するルール。 ルールは括弧 () で定義され、一連のカスタム patternVariables で構成されます。
注
|
- Quantifier
quantifier
は、patternVariable
定義を満たすイベントの発生回数を指定します。利点 説明 * ゼロまたは複数回 + 1 回または複数回 ? ゼロまたは 1 回 {n} n 回 {n,} n 倍以上 {n, m} n 倍以上、m 倍以下 {,m} m 倍以下 デフォルトでは、最長一致が実行されます。 たとえば、パターンが
A -> B+
、入力がa b1, b2, b3
の場合は、出力はa b1, a b1 b2, a b1 b2 b3
です。 最短一致を実行するには、量指定子に疑問符 (?
) を追加します。*?
+?
{n}?
{n,}?
{n, m}?
{,m}?
前の例でパターンおよび入力に対して生成された出力は、
a b1, a b2, a b1 b2, a b3, a b2 b3, a b1 b2 b3
に変わります。注- WITHIN 文は、シーケンス内の指定されたルールに準拠するイベントの最大期間を定義します。
- 静的ウィンドウ形式:
INTERVAL ‘string’ timeUnit [ TO timeUnit ]
. 例:INTERVAL ‘10’ SECOND, INTERVAL ‘45’ DAY, INTERVAL ‘10:20’ MINUTE TO SECOND, INTERVAL ‘10:20.10’ MINUTE TO SECOND, INTERVAL ‘10:20’ HOUR TO MINUTE, INTERVAL ‘1-5’ YEAR TO MONTH
. - 動的ウィンドウ形式:
INTERVAL intervalExpression
. 例:INTERVAL A.windowTime + 10
の A はパターン定義の最初の patternVariable を示します。 intervalExpression 定義では、パターン定義で patternVariable を使用することができます。 ただし、現在使用できるのは、パターン定義の最初の patternVariable のみです。 intervalExpression では、UDF を使用することができます。 intervalExpression の結果はウィンドウサイズを示します。 結果は long 型で、ミリ秒単位でなければなりません。 - DEFINE 文は、PATTERN 文の patternVariables の意味を定義します。 patternVariable が DEFINE 文で定義されていない場合は、patternVariable は各イベントで有効です。
- MEASURES および DEFINE 文関数
関数 説明 行パターン列参照 この関数の形式は、 patternVariable.col
です。 これは、patternVariable
に準拠するイベントの指定された列にアクセスするために使用されます。PREV この関数は DEFINE 文でのみ使用でき、通常は Row Pattern Column
で機能します。 PREV 関数は、指定されたパターンに一致するイベントの前に、指定されたオフセットで前のイベントの指定された列にアクセスするために使用されます。 例:DOWN AS DOWN.price < PREV(DOWN.price)
。PREV (A.price)
は、現在のイベントより前のイベントのprice
列の値を示します。DOWN.price
はPREV(DOWN.price, 0)
と同等であり、PREV(DOWN.price)
はPREV(DOWN.price, 1)
と同等であることにご注意ください。FIRST または LAST これらの関数は一般的に Row Pattern Column References
で機能します。 FIRST 関数または LAST 関数を使用して、指定されたパターンに準拠する一連のイベント内の指定されたオフセットでイベントにアクセスします。 たとえば、FIRST(A.price, 3)
は、パターン A に準拠する一連のイベントの 4 番目のイベントを示し、LAST(A.price, 3)
は、パターンに準拠する一連のイベントの最後の 3 つを示します。 - 出力列
関数 出力列 ONE ROW PER MATCH PARTITION BY
およびMEASURES
で指定された列が含まれます。PARTITION BY
で指定された列をMEASURES
で再度指定する必要はありません。ONE ROW PER MATCH WITH TIMEOUT ROWS 一致が成功するか、タイムアウトになると、出力イベントが生成されます。 タイムアウト間隔は、 PATTERN
文のWITHIN
文によって定義されます。注- PATTERN 文を定義するときは、WITHIN 文も定義することを推奨します。 WITHIN 文が定義されていない場合は、状態サイズが大きくなる可能性があります。
- ORDER BY によって指定される最初の列は、EVENT TIME または PROCESS TIME 列でなければなりません。
例
- 構文例
SELECT * FROM Ticker MATCH_RECOGNIZE ( PARTITION BY symbol ORDER BY tstamp MEASURES STRT.tstamp AS start_tstamp, LAST(DOWN.tstamp) AS bottom_tstamp, LAST(UP.tstamp) AS end_tstamp ONE ROW PER MATCH AFTER MATCH SKIP TO NEXT ROW PATTERN (STRT DOWN+ UP+) WITHIN INTERVAL '10' SECOND DEFINE DOWN AS DOWN.price < PREV(DOWN.price), UP AS UP.price > PREV(UP.price) ) MR ORDER BY MR.symbol, MR.start_tstamp;
- テストデータ
timestamp (TIMESTAMP) card_id (VARCHAR) location (VARCHAR) action (VARCHAR) 2018-04-13 12:00:00
1 WW Tom 2018-04-13 12:05:00
1 WW1 Tom 2018-04-13 12:10:00
1 WW2 Tom 2018-04-13 12:20:00
1 WW Tom - テストケース構文
CREATE TABLE datahub_stream ( `timestamp` TIMESTAMP, card_id VARCHAR, location VARCHAR, `action` VARCHAR, WATERMARK wf FOR `timestamp` AS withOffset(`timestamp`, 1000) ) WITH ( type = 'datahub' ... ); CREATE TABLE rds_out ( start_timestamp TIMESTAMP, end_timestamp TIMESTAMP, card_id VARCHAR, event VARCHAR ) WITH ( type= 'rds' ... ); -- Case description -- When payments with a card with a unique ID (card_id) occur at two different locations within 10 minutes, an alert is triggered. This helps monitor credit card identity fraud. -- Define the computational logic as follows: insert into rds_out select `start_timestamp`, `end_timestamp`, card_id, `event` from datahub_stream MATCH_RECOGNIZE ( PARTITION BY card_id -- Partition data by card_id. The data with the same card ID is allocated to the same compute node. ORDER BY `timestamp` -- Sort events by time in a window. MEASURES -- Define how to construct an output event based on the input events that are successfully matched. e2.`action` as `event`, e1.`timestamp` as `start_timestamp`, -- Define the time of the first event as start_timestamp. LAST(e2.`timestamp`) as `end_timestamp`-- Define the time of the last event as end_timestamp. ONE ROW PER MATCH -- Generate an output event upon a successful match. AFTER MATCH SKIP TO NEXT ROW-- Start the next match from the next row upon a successful match. PATTERN (e1 e2+) WITHIN INTERVAL '10' MINUTE -- Define two events e1 and e2. DEFINE -- Define the meanings of patternVariables in the PATTERN statement. e1 as e1.action = 'Tom', -- Mark the action of e1 as Tom. e2 as e2.action = 'Tom' and e2.location <> e1.location -- Mark the action of e2 as Tom. The locations of e1 and e2 are different. );
- テスト結果
start_timestamp (TIMESTAMP) end_timestamp (TIMESTAMP) card_id (VARCHAR) event (VARCHAR) 2018-04-13 20:00:00.0
2018-04-13 20:05:00.0
1 Tom 2018-04-13 20:05:00.0
2018-04-13 20:10:00.0
1 Tom