云原生数据仓库 AnalyticDB 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函数用于检查事件序列是否按照给定的顺序发生。系统会根据您定义的事件序列,与指定的正则表达式进行匹配,返回一个布尔值。若返回值为1,代表是;若返回值为0,则代表否。
语法
SEQUENCE_MATCH(pattern, timestamp, cond1, cond2, ...)
参数说明
参数 | 说明 |
pattern | 用于匹配事件发生顺序的正则表达式。 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 | 用于匹配事件发生顺序的正则表达式。 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 | +------------------------------------------------------------------+