全部產品
Search
文件中心

AnalyticDB:路徑分析函數

更新時間:Jul 27, 2024

AnalyticDB for MySQL的路徑分析函數(包括SEQUENCE_MATCH和SEQUENCE_COUNT)能夠高效地處理路徑計算任務,進行事件序列的匹配和計數,並將分析結果應用於複雜事件序列的檢測和統計。本文為您介紹路徑分析函數的使用。

AnalyticDB for MySQL支援的路徑分析函數如下:

前提條件

叢集核心版本需為3.2.1.0及以上版本。

說明

如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。

測試資料集

為方便您測試路徑分析函數,提供操作樣本如下:

  1. 建立測試資料表。

    CREATE TABLE sequence_test(
      `uid` INT COMMENT 'user id',
      `ts` DATETIME COMMENT 'date time', 
      `number` INT NULL COMMENT 'number' 
    );
  2. 插入資料。

    INSERT INTO sequence_test  VALUES (1, '2022-11-02 10:41:00', 1);
    INSERT INTO sequence_test  VALUES (2, '2022-11-02 13:28:02', 2); 
    INSERT INTO sequence_test  VALUES (3, '2022-11-02 16:15:01', 1);                                      
    INSERT INTO sequence_test  VALUES (4, '2022-11-02 19:05:04', 2); 
    INSERT INTO sequence_test  VALUES (5, '2022-11-02 20:08:44', 3); 

SEQUENCE_MATCH

SEQUENCE_MATCH函數用於檢查事件序列是否按照給定的順序發生。系統會根據您定義的事件序列,與指定的Regex進行匹配,返回一個布爾值。若傳回值為1,代表是;若傳回值為0,則代表否。

文法

SEQUENCE_MATCH(pattern, timestamp, cond1, cond2, ...)

參數說明

參數

說明

pattern

用於匹配事件發生順序的Regex。

pattern支援文法:'(?n)(?n)''(?n).*(?n)''(?n)(?t operator value)(?n)'。參數說明如下:

  • (?n):匹配條件事件,表示cond約束列表中的第n個條件。n的取值不可以超出cond約束條件數量,且不能為0。

  • .*:兩個指定事件之間可以有任意數量的其他事件。

  • (?t operator value):用來指定兩個事件的時間差。

    • t :固定保留字,代表timestamp時間戳記欄位。

    • operator:操作符,支援>=><<===<>!=

    • value:時間戳記欄位的值,支援浮點數和正負數。

      • DATATIME和TIMESTAMP:單位為毫秒(ms)。

      • DATE:單位為天(d)。

      • BIGINT: 單位根據事件發生時間單位而定。

timestamp

事件的時間戳記欄位,表示事件發生的時間。欄位類型支援BIGINT、DATETIME、TIMESTAMP和DATE。

cond

事件的約束條件,每個條件通常是對某一欄位的比較操作。

資料類型是BOOLEAN。

cond最多可以傳遞32個約束條件。

說明

該函數先篩選出滿足cond約束條件的事件,再和pattern匹配。

樣本

  • 篩選出事件序列中存在的以下三類事件:number=1number=2number=3。判斷已篩選出的序列中是否存在事件1number=1之後,緊接著發生了事件3number=3的情況。

    SQL查詢語句如下:

    SELECT SEQUENCE_MATCH('(?1)(?3)', ts, number = 1, number = 2, number = 3) FROM sequence_test;

    返回結果:

    +-------------------------------------------------------------------+
    | sequence_match('(?1)(?3)', ts, number = 1, number = 2, number = 3)|
    +-------------------------------------------------------------------+
    |                                0                                  |
    +-------------------------------------------------------------------+
  • 篩選出事件序列中存在的以下三類事件:number=1number=2number=3。判斷已篩選出的序列中是否存在事件1number=1之後,發生了事件3number=3,且事件1和事件3之間可以發生其他事件的情況。

    SQL查詢語句如下:

    SELECT SEQUENCE_MATCH('(?1).*(?3)', ts, number = 1, number = 2, number = 3) FROM sequence_test;

    返回結果:

    +----------------------------------------------------------------------+
    | sequence_match('(?1).*(?3)', ts, number = 1, number = 2, number = 3) |
    +----------------------------------------------------------------------+
    |                                  1                                   |
    +----------------------------------------------------------------------+
  • 篩選出事件序列中存在的以下兩類事件:number=1number=2。判斷已篩選出的序列中是否存在事件1number=1之後,緊接著發生了事件2number=2,且二者之間的時間差大於等於3600毫秒的情況。

    SQL查詢語句如下:

    SELECT SEQUENCE_MATCH('(?1)(?t>=3600)(?2)', ts, number = 1, number = 2) FROM sequence_test;

    返回結果:

    +------------------------------------------------------------------+
    | sequence_match('(?1)(?t>=3600)(?2)', ts, number = 1, number = 2) |
    +------------------------------------------------------------------+
    |                                1                                 |
    +------------------------------------------------------------------+

SEQUENCE_COUNT

SEQUENCE_COUNT函數用於計算指定的事件序列出現的次數。

文法

SEQUENCE_COUNT(pattern, timestamp, cond1, cond2, ...)

參數說明

參數

說明

pattern

用於匹配事件發生順序的Regex。

pattern支援文法:'(?n)(?n)''(?n).*(?n)''(?n)(?t operator value)(?n)'。參數說明如下:

  • (?n):匹配條件事件,表示cond約束列表中的第n個條件。n的取值不可以超出cond約束條件數量,且不能為0。

  • .*:兩個指定事件之間可以有任意數量的其他事件。

  • (?t operator value):用來指定兩個事件的時間差。

    • t :固定保留字,代表timestamp時間戳記欄位。

    • operator:操作符,支援>=><<===<>!=

    • value:時間戳記欄位的值,支援浮點數和正負數。

      • DATATIME和TIMESTAMP:單位為毫秒(ms)。

      • DATE:單位為天(d)。

      • BIGINT: 單位根據事件發生時間單位而定。

timestamp

事件的時間戳記欄位,表示事件發生的時間。欄位類型支援BIGINT、DATETIME、TIMESTAMP和DATE。

cond

事件的約束條件,每個條件通常是對某一欄位的比較操作。

資料類型是BOOLEAN。

cond最多可以傳遞32個約束條件。

說明

該函數先篩選出滿足cond約束條件的事件,再和pattern匹配。

樣本

  • 篩選出事件序列中存在的以下三類事件:number=1number=2number=3。計算已篩選出的事件序列中滿足以下條件的事件序列數量:事件1number=1之後,緊接著發生了事件3number=3

    SQL查詢語句如下:

    SELECT SEQUENCE_COUNT('(?1)(?3)', ts, number = 1, number = 2, number = 3) FROM sequence_test;

    返回結果:

    +--------------------------------------------------------------------+
    | sequence_count('(?1)(?3)', ts, number = 1, number = 2, number = 3) |
    +--------------------------------------------------------------------+
    |                                0                                   |
    +--------------------------------------------------------------------+
  • 篩選出事件序列中存在的以下三類事件:number=1number=2number=3。計算已篩選出的事件序列中滿足以下條件的事件序列數量:事件1number=1之後,發生了事件3number=3,且事件1和事件3之間可以發生其他事件。

    SQL查詢語句如下:

    SELECT SEQUENCE_COUNT('(?1).*(?3)', ts, number = 1, number = 2, number = 3) FROM sequence_test;

    返回結果:

    +----------------------------------------------------------------------+
    | sequence_count('(?1).*(?3)', ts, number = 1, number = 2, number = 3) |
    +----------------------------------------------------------------------+
    |                                  1                                   |
    +----------------------------------------------------------------------+
  • 篩選出事件序列中存在的以下兩類事件:number=1number=2。計算已篩選出的事件序列中滿足以下條件的事件序列數量:事件1number=1之後,緊接著發生了事件2number=2,且二者之間的時間差大於等於3600毫秒。

    SQL查詢語句如下:

    SELECT SEQUENCE_COUNT('(?1)(?t>=3600)(?2)', ts, number = 1, number = 2) FROM sequence_test;

    返回結果:

    +------------------------------------------------------------------+
    | sequence_count('(?1)(?t>=3600)(?2)', ts, number = 1, number = 2) |
    +------------------------------------------------------------------+
    |                              2                                   |
    +------------------------------------------------------------------+