全部产品
Search
文档中心

云原生数据仓库AnalyticDB:路径分析函数

更新时间:Jul 26, 2024

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

语法

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

参数说明

参数

说明

pattern

用于匹配事件发生顺序的正则表达式。

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

用于匹配事件发生顺序的正则表达式。

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                                   |
    +------------------------------------------------------------------+