我建立了一个运动分析应用程序,该应用程序从具有以下模式的运动流中获取数据。
--------------------------
Column ColumnType
--------------------------
Level varchar(10)
RootID varchar(32)
ProcessID varchar(16)
EntityName varchar(64)
Message varchar(512)
Threshold varchar(32)
TriggerTime timestamp
我的目标是创建一个实时运动学分析解决方案,该解决方案将级别为“ OVERFLOW”和“ 根据RootID对它们进行分组。理想情况下,所有属于RootID的记录都有望在跨度内达到运动 5分钟。因此,我正在考虑为此设置一个交错窗口,到目前为止,我已经提出了此SQL。
CREATE OR REPLACE STREAM "OVERFLOW_SQL_STREAM" (
"Level" varchar (10),
"RootID" varchar (32),
"ProcessID" varchar(16),
"EntityName" varchar(64),
"Message" varchar(512),
"Threshold" varchar(32),
"TriggerTime" timestamp
);
CREATE OR REPLACE PUMP "STREAM_PUMP" AS
INSERT INTO "OVERFLOW_SQL_STREAM"
SELECT STREAM
"Level" varchar (10),
"RootID" varchar (32),
"ProcessID" varchar(16),
"EntityName" varchar(64),
"Message" varchar(512),
"Threshold" varchar(32),
"TriggerTime" timestamp
FROM "SOURCE_SQL_STREAM_001"
WHERE "Level" like "OVERFLOW"
WINDOWED BY STAGGER (
PARTITION BY "RootID",FLOOR("TriggerTime" TO MINUTE) RANGE INTERVAL '5' MINUTE);
我在SQL中收到一条错误消息,指出“ PARTITION BY子句没有'Level'列”。我不明白为什么 我应该将该列添加到分区中,因为我希望仅通过RootID列而不是任何其他分区来对记录进行分区。 添加该列会引发错误,提示我应该添加下一个列,依此类推。我无法理解该错误。 请帮助我!谢谢!
答案 0 :(得分:0)
有针对此类型问题的解决方法。 您可以使用FIRST_VALUE()或LAST_VALUE()强制转换结果,而不是直接传递结果。
CREATE OR REPLACE PUMP "STREAM_PUMP" AS
INSERT INTO "OVERFLOW_SQL_STREAM"
SELECT STREAM
LAST_VALUE("Level") AS Level,
"RootID" varchar (32),
....
....
....
"TriggerTime" timestamp
FROM "SOURCE_SQL_STREAM_001"
WHERE "Level" like "OVERFLOW"
WINDOWED BY STAGGER (
PARTITION BY "RootID",FLOOR("TriggerTime" TO MINUTE) RANGE INTERVAL '5' MINUTE);
这是无需添加PARTITION BY子句即可创建流泵的方法。
FIRST_VALUE()-要获得与 流分区(此处为RootID)
LAST_VALUE()-反之亦然