【问题标题】:Get first record in Tumbling Window using Azure Stream Analytics使用 Azure 流分析在 Tumbling Window 中获取第一条记录
【发布时间】:2019-02-13 05:24:07
【问题描述】:

我项目的某些部分使用 Java 中的 Esper 进行复杂的事件处理。我打算用 Azure 流分析替换 Esper。

用例: FTOD(当天的第一张票)和 FTOP(项目的第一张票)

我不断从 Eventhub 获取票证数据,并希望生成 2 种类型的警报(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"}]

【问题讨论】:

    标签: azure azure-stream-analytics


    【解决方案1】:

    根据您的描述,我认为您可以了解带有 GROUP BY 条件的 LAST 运算符。 LAST 允许在定义的约束内查找事件流中的最新事件。

    在流分析中,LAST 的范围(即在多远 它需要查看的当前事件的历史记录)始终限于 使用 LIMIT DURATION 子句的有限时间间隔。 LAST 可以 可选地限制为仅考虑与当前匹配的事件 使用 PARTITION BY 和 WHEN 子句。 LAST 不受 WHERE 子句中谓词的影响,加入 JOIN 子句中的条件,或 GROUP BY 子句中的分组表达式 当前查询。

    请参见上述文档中的示例:

    SELECT    
           LAST(TicketNumber) OVER (LIMIT DURATION(hour, 24))  
    FROM input 
    

    只是总结一下,想要获取第一项的时候需要考虑isFirst方法。

    【讨论】:

    • @PankajRawat 很抱歉造成误会,你可以看看 isFirst 方法试试。
    • @PankajRawat 你真好,我已经在答案中总结了方法。您可以标记它以供其他人参考。非常感谢。
    【解决方案2】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2019-12-28
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多