我的项目的一部分在Java中使用Esper进行复杂的事件处理。我打算用Azure Stream Analytics取代Esper。
使用案例:FTOD(当天的第一张票)和FTOP(项目的第一张票)
我不断从Eventhub获取票证数据,并希望生成两种类型的警报(FTOD和FTOP)。我认为thumblingWindow最适合这种情况。
但是我无法在窗口中选择第一条记录。有什么建议如何在24小时窗口中选择第一条记录?
以下是针对FTOD的Esper查询
String statementQuery = "context context_" + plantIdStr
+ " select distinct * from TicketInfoComplete as ticket where plantId = '"
+ entry.getKey() + "' and ruleType='FTOD' output first every 24 hours";
以下是我的传入消息数据
[{"DeviceSerialNumber":"190203XXX001TEST","MessageTimestamp":"2019-02-11T13:46:08.0000000Z","PlantId":"141","ProjectId":"Mobitest","ProjectName":"Mobitest","TicketNumber":"84855","TicketDateTimeinUTC":"2019-02-11T13:46:08.0000000Z","AdditionalInfo":{"value123":"value2"},"Timeout":60000,"Traffic":1,"Make":"Z99","TruckMake":"Z99","PlantName":"RMZ","Status":"Valid","PlantMakeSerialNumber":"Z99|190203XXX001TEST","ErrorMessageJsonString":"[]","Timezone":"India Standard Time"}]
根据您的描述,我认为您可以通过LAST条件了解GROUP BY
运算符。 LAST
允许用户在定义的约束内查找事件流中的最新事件。
在流分析中,使用LIMIT DURATION子句,LAST的范围(即,历史记录与当前事件需要查看的距离)始终限制在有限的时间间隔内。可以选择将LAST限制为仅使用PARTITION BY和WHEN子句考虑与特定属性或条件上的当前事件匹配的事件。 LAST不受WHERE子句中的谓词,JOIN子句中的连接条件或当前查询的GROUP BY子句中的表达式分组的影响。
请参阅上面文档中的示例:
SELECT
LAST(TicketNumber) OVER (LIMIT DURATION(hour, 24))
FROM input
只是为了总结,当你想得到第一个项目时,需要考虑isFirst方法。
精确查询使用IsFirst方法进行FTOD和FTOP警报后使用的内容。
SELECT
DeviceSerialNumber,MessageTimestamp,PlantId,TruckId,ProjectId,ProjectName,
CustomerId,CustomerName,TicketNumber,TicketDateTimeinUTC,TruckSerialNumber,
TruckMake,PlantName,PlantMakeSerialNumber,Timezone,'FTOD' as alertType
INTO
[alertOutput]
FROM
[ticketInput]
where ISFIRST(mi, 2)=1
SELECT
DeviceSerialNumber,MessageTimestamp,PlantId,TruckId,ProjectId,ProjectName,
CustomerId,CustomerName,TicketNumber,TicketDateTimeinUTC,TruckSerialNumber,
TruckMake,PlantName,PlantMakeSerialNumber,Timezone,'FTOP' as alertType
INTO
[ftopOutput]
FROM
[ticketInput]
where ISFIRST(mi, 2) OVER (PARTITION BY PlantId) = 1