• Esper系列(三)Context和Group by


    Context

    把不同的事件按照框的规则框起来(规则框在partition by中定义),并且有可能有多个框,而框与框之间不会互相影响。

    功能:

    组合事件查询并进行分组,类型:Hash Context、Category Context、Non-Overlapping Context。

    格式:

    create context context_name partition [by] event_property [and event_property [and ...]] 
    from stream_def [, event_property [...] 
    from stream_def] [, ...] 

    例子:

    // 创建context
    create context ctEvent partition by name from orderEvetn;
     
    // 统计最近两秒内各context区间中事件salary值的总和
    String epsql = "context ctEvent select sum(salary) as result from orderEvent.win:time(2 sec)";
    // 当context各区间中存在事件个数非0且为2的整数倍时,统计该区间事件属性最近两个事件salary属性的总和,这里2由win:length_batch(2)指定;
    String epsql = "context ctEvent select sum(salary) as result from orderEvent.win:length_batch(2)";
     

    说明:

    win:length_batch(num):该标识限定事件个数必须非0且为num的整数倍时就触发监听,并对最近num个事件进行对应的处理。

    win:length(num):该标识作用于最近的num个事件,没有达到num个数监听也会被触发。

    win:length(num)与win:length_batch(num)相比后者相当于在前者的基础上增加了一个批处理设置,num个数达到后才进行处理。

    win:time(time):该标识处理最近的time时间内的事件。

    win:time_batch(time):该标识符与win:length_batch(num)类似不过这里是时间。

    作用:

    根据定义context中指定的属性对事件流中属性值进行分类,结合EPL语句运行时将针对分类的结果进行分析运算。

    多个事件流的context, 每个流的中用于context的属性的数量要一样,数据类型也要一致。

    Context各属性字段描述表

    image

    Name:Context名称;

    ID:引擎自动为context分配从0开始依次递增,context作用的事件流,同一属性类型的事件流ID值相同;

    Key1~keyN:分别对应context作用于事件流的各个属性字段;

    Group by

    格式:

    group by aggregate_free_expression [, aggregate_free_expression] [, ...];

    注意:group by后面不能包含聚合函数,也不能是select子句中聚合函数修饰的属性名;

    功能:

    group by的对象就是一个值(属性字段也是值),以相同的值进行分组;

    使用Group by的时候,会遇到分组数量太多的情况。比如以时间单位进行分组,那么内存使用一定是一个大问题。因此@Hint为其设计了两个属性,用于限制Group by的生存时间,使虚拟机能及时回收内存。这两个属性分别为reclaim_group_aged和reclaim_group_freq;

    // 以name进行分组,对最近3 秒内的事件取salary属性的平均值,@Hint('reclaim_group_aged=1')表示在1秒内对没有更新数据的分组进行回收, reclaim_group_aged后面值的单位是秒;
    String epsql = "@Hint('reclaim_group_aged=1')select avg(salary) as result from orderEvent.win:time(3 sec) group by name";
    // 以name进行分组,对最近3 秒内的事件取salary属性的平均值,@Hint('reclaim_group_aged=2,reclaim_group_freq=1')表示对两秒内对没有更新数据的分组进行回收,每1秒查探回收一次(防止数据量大的时候内存溢出)
    String epsql = "@Hint('reclaim_group_aged=2,reclaim_group_freq=1')select avg(salary) as result from orderEvent.win:time(3) group by name";

    Having

    与SQL作用类似,where子句中不能包含聚合函数,而Having的作用就是针对这种应用的处理。

  • 相关阅读:
    MPS和MRP之间有什么样的关系呢
    java中静态代码块详解
    SQL server 分组后每组取出任意一行
    人是否能成功,其实可能很早就能看出来
    国内外产品经理的区别
    Yarn 和 NPM 国内快速镜像(淘宝镜像)
    vue-cli 使用less 遇到的问题 || vue-cli 使用less
    布隆过滤器
    PHP性能优化
    Redis-高并发代言词,为什么做分布式要Redis?
  • 原文地址:https://www.cnblogs.com/jianyuan/p/4894372.html
Copyright © 2020-2023  润新知