我有一个似乎应该由Kinesis Analytics SQL支持的用例,但我似乎无法弄明白。
以下是我的情景:
我的目标是获取一个报告,该报告按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分钟桶中被分解。
答案 0 :(得分:1)
LAG现已推出......也许有帮助。
http://docs.aws.amazon.com/kinesisanalytics/latest/sqlref/sql-reference-lag.html
答案 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分钟的捕获窗口。交错窗口是汇总这些日志以进行分析的理想选择。
交错窗口可解决相关记录未落入同一时间限制窗口(例如使用翻滚窗口时)的问题。