AnalyticDB for MySQL的路徑分析函數(包括SEQUENCE_MATCH和SEQUENCE_COUNT)能夠高效地處理路徑計算任務,進行事件序列的匹配和計數,並將分析結果應用於複雜事件序列的檢測和統計。本文為您介紹路徑分析函數的使用。
AnalyticDB for MySQL支援的路徑分析函數如下:
SEQUENCE_MATCH:檢查事件序列是否按照給定的順序發生。
SEQUENCE_COUNT:計算給定的事件序列出現的次數。
前提條件
叢集核心版本需為3.2.1.0及以上版本。
如何查看叢集核心版本,請參見如何查看執行個體版本資訊。如需升級核心版本,請聯絡支援人員。
測試資料集
為方便您測試路徑分析函數,提供操作樣本如下:
建立測試資料表。
CREATE TABLE sequence_test( `uid` INT COMMENT 'user id', `ts` DATETIME COMMENT 'date time', `number` INT NULL COMMENT 'number' );
插入資料。
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支援文法:
|
timestamp | 事件的時間戳記欄位,表示事件發生的時間。欄位類型支援BIGINT、DATETIME、TIMESTAMP和DATE。 |
cond | 事件的約束條件,每個條件通常是對某一欄位的比較操作。 資料類型是BOOLEAN。 cond最多可以傳遞32個約束條件。 說明 該函數先篩選出滿足cond約束條件的事件,再和pattern匹配。 |
樣本
篩選出事件序列中存在的以下三類事件:
number=1
,number=2
,number=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=1
,number=2
,number=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=1
和number=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支援文法:
|
timestamp | 事件的時間戳記欄位,表示事件發生的時間。欄位類型支援BIGINT、DATETIME、TIMESTAMP和DATE。 |
cond | 事件的約束條件,每個條件通常是對某一欄位的比較操作。 資料類型是BOOLEAN。 cond最多可以傳遞32個約束條件。 說明 該函數先篩選出滿足cond約束條件的事件,再和pattern匹配。 |
樣本
篩選出事件序列中存在的以下三類事件:
number=1
,number=2
,number=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=1
,number=2
,number=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=1
和number=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 | +------------------------------------------------------------------+