我正在使用Kinesis Analytics,我正在尝试了解如何编写我的应用程序,以便在24小时内为我提供一个滑动窗口。我所生成的数据是正确的,但它看起来每次都会重新生成它,这可能就是它应该做的事情而我自己的无知阻止我正确看待这个问题?
我想做什么:
我有一些设备可以提供Kinesis Stream,这个Kinesis分析应用程序可以连接到它。
现在,当记录进来时,我想要做的是SUM
过去24小时内的值并存储它。因此,在Kinesis Analytics完成它的工作之后,我将它连接到Lambda以完成一些事情。
我的问题是,当我模拟发送一些数据时,在这种情况下有5条记录,一切都在运行,它运行多次,而不是5.它看起来就像每次记录进来时重做窗口中的所有内容(预期)这会触发发射的每一行的lambda。随着桌子的增长,这是个坏消息。我真正想要的只是来自NOW - 24 HOUR
窗口的最新值,"id"
字段,所以我可以加入那个" id"回到其他地方存储的记录。
我的应用程序如下所示:
CREATE OR REPLACE STREAM "DEVICE_STREAM" (
"id" VARCHAR(64),
"timestamp_mark" TIMESTAMP,
"device_id" VARCHAR(64),
"property_a_id" VARCHAR(64),
"property_b_id" VARCHAR(64),
"value" DECIMAL
);
CREATE OR REPLACE PUMP "DEVICE_PUMP" AS
INSERT INTO "DEVICE_STREAM"
SELECT STREAM "id",
"timestamp_mark",
"device_id",
"x_id",
"y_id",
SUM("value") OVER W1 AS "value",
FROM "SOURCE_SQL_STREAM_001"
WINDOW W1 AS (
PARTITION BY "device_id", "property_a_id", "property_b_id" ORDER BY "SOURCE_SQL_STREAM_001".ROWTIME
RANGE INTERVAL '24' HOUR PRECEDING
);
嗯...这可能是一个更好的主意,在子选择中进行聚合并从中进行选择。看起来我需要第二个窗口(下面是W2
)以确保我获得了每个记录。
CREATE OR REPLACE STREAM "DEVICE_STREAM" (
"id" VARCHAR(64),
"timestamp_mark" TIMESTAMP,
"device_id" VARCHAR(64),
"property_a_id" VARCHAR(64),
"property_b_id" VARCHAR(64),
"value" DECIMAL
);
CREATE OR REPLACE PUMP "DEVICE_PUMP" AS
INSERT INTO "DEVICE_STREAM"
SELECT STREAM s."id",
s."timestamp_mark",
s."device_id",
s."property_a_id",
s."property_b_id",
v."value"
FROM "SOURCE_SQL_STREAM_001" OVER W2 AS s, (
SELECT STREAM "SOURCE_SQL_STREAM_001"."ROWTIME", "id",
"timestamp_mark",
"device_id",
"property_a_id",
"property_b_id",
SUM("value") OVER W1 AS "value",
FROM "SOURCE_SQL_STREAM_001"
WINDOW W1 AS (
PARTITION BY "device_id", "property_a_id", "property_b_id" ORDER BY "SOURCE_SQL_STREAM_001".ROWTIME
RANGE INTERVAL '24' HOUR PRECEDING
)
) AS v
WHERE s."id" = v."id"
WINDOW W2 AS (
RANGE INTERVAL '1' SECOND PRECEDING
);
另外我注意到,如果我重新启动Kinesis Analytics应用程序,SUM
值会重置,所以显然它不会在重新启动后持续存在,这可能会使其不适合此解决方案。我可能只需要设置SQL服务器并定期删除旧记录。
答案 0 :(得分:0)
一般情况下,当您需要根据事件中的数据执行某些操作时,建议使用Streaming Analytics解决方案(特别是Kinesis Analytics),而不是像挂钟时间那样的外部事件。
原因很简单:如果你需要每24小时做一次,你就会创建一个工作,从存储(DB)中提取一次数据,执行你的任务,然后“睡觉”#34;再过24小时 - 没有复杂性,可管理的开销。现在,如果您需要根据数据执行某些操作(例如,当多个事件中某些字段的SUM超过X时),您就会遇到传统解决方案的问题,因为没有简单的标准可以运行它。如果定期运行它,可能会多次调用它,直到满足数据驱动条件,从而产生明显的开销。
在最新的案例中,Streaming Analytics解决方案将按设计使用,并在需要时触发您的逻辑,从而最大限度地减少开销。
如果您更喜欢使用Streaming Analytics(我个人不建议根据您的问题描述),但是您可能会考虑使用Drools Kinesis Analytics,而不是使用Kinesis Analytics语法。它的功能包括crons和collectors,它们为您提供了按时触发作业的简单方法。