複合イベント処理 (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 で構成されます。
  • 2 つの patternVariables がスペースで区切られている場合、patternVariables に準拠するイベントは互いに隣接し、これらのイベントの間に他のイベントはありません。
  • 2 つの patternVariables が矢印記号 (->) で区切られている場合、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.pricePREV(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