分析AWS Kinesis Analytics SQL

时间:2017-06-08 17:57:35

标签: amazon-kinesis

我有一个似乎应该由Kinesis Analytics SQL支持的用例,但我似乎无法弄明白。

以下是我的情景:

  • 我有一个数据输入流,每个事件都有一个event_time 字段和device_id字段。
  • 我想通过event_time和device_id聚合数据。这里event_time作为源数据中的字段提供,行不是添加到Kinesis Analytics应用程序的ROWTIME,也不是大概到达时间。
  • 将数据发送到我的流的过程有一些延迟,因此可以在event_time发生后的3分钟内将行添加到我的流中。

我的目标是获取一个报告,该报告按event_time和device_id汇总,每个event_time有一行,并包含该行中该event_time的所有数据。

因此,我的数据流可能如下所示:

rowtime, event_time, device_id, num_things
12:29:04, 12:27:00, server1, 19
12:30:22, 12:28:00, server1, 33
12:30:23, 12:27:00, server2, 8
12:30:25, 12:29:00, server1, 11
12:31:33, 12:28:00, server2, 2
12:31:44, 12:29:00, server3, 83
12:32:56, 12:29:00, server2, 6

这里的关键点是event_times的数据(如12:27)会在几分钟内出现,并且比将这些数据添加到Kinesis Analytics流中的时间提前3分钟。

我希望我的输出为:

event_time, total_num_things
12:27, 27  <- sums up 19 + 8 for event_time 12:27
12:28, 35 <- sums up 33+2 for event_time 12:28
12:29, 100 <- sums up 11+83+6 for event_time 12:29

这可能吗?

我能找到的所有示例都会在输出中有一个ROWTIME的翻滚窗口,因此event_time的聚合可能会在多个ROWTIME分钟桶中被分解。

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

对于那些没有搬到新技术的人;-)。滑动窗口在这里不太合适,因为我们不会在时间间隔内设置事件约束,而是我们总是希望按时间分组然后求和。只是事件不能立即获得。

因此语义更接近工作会话,其中sessionId是时间点。

这可以用Drools表示:

类型:

package com.test;

import java.util.List;

declare EventA
    @role(event)

    eventTime: long;
    deviceId: int;
    numThings: int;
    seen: boolean;
end

declare Group
    eventTime: long @key;
    events: List;
end

declare Summary
    eventTime: long;
    sumNumThings: int;
end

规则:

package com.test;

import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;

rule "GroupCreate"
when
    // for every new EventA
    EventA(seen == false, $time: eventTime) from entry-point events
    // check there is no group
    not (exists(Group(eventTime == $time)))
then
    insert(new Group($time, new ArrayList()));
end

rule "GroupJoin"
when
    // for every new EventA
    $a : EventA(seen == false) from entry-point events
    // get event's group
    $g: Group(eventTime == $a.eventTime)
then
    $g.getEvents().add($a);
    modify($a) {setSeen(true);}
end

rule "Summarize"
// if session timed out, clean up first
salience 5
when
    // for every EventA
    $a : EventA() from entry-point events
    // check there is no more events within 30 seconds
    not (exists(EventA(this != $a, eventTime == $a.eventTime,
        this after[0, 30s] $a) from entry-point events))
    // get event's group
    $g: Group(eventTime == $a.eventTime)
then
    int sum = (int)$g.getEvents().stream().collect(
        Collectors.summingInt(EventA::getNumThings));
    insertLogical(new Summary($g.getEventTime(), sum));

    // cleanup
    for (Object $x : $g.getEvents())
        delete($x);
    delete($g);
end

您可以使用this service

创作Drools Kinesis Analytics

答案 2 :(得分:0)

您似乎正在寻找“交错Windows”。

https://docs.aws.amazon.com/kinesisanalytics/latest/dev/stagger-window-concepts.html

  

使用交错窗口是一种加窗方法,适用于分析在不一致时间到达的数据组。非常适合于任何时间序列分析用例,例如一组相关的销售或日志记录。

     

例如,VPC流日志具有大约10分钟的捕获窗口。但是,如果您要在客户端上汇总数据,则它们最多可以有15分钟的捕获窗口。交错窗口是汇总这些日志以进行分析的理想选择。

     

交错窗口可解决相关记录未落入同一时间限制窗口(例如使用翻滚窗口时)的问题。