Azure Stream Analytics关联双EventHub同源流查询无输出问题咨询
问题排查&修复方案
现有查询无输出的核心原因
- Source1中
TIMESTAMP BY TimeSlot是非法配置:TIMESTAMP BY只能指定输入流原生携带的时间字段,不能使用当前查询自定义的别名字段,导致Source1的时间戳计算逻辑完全异常,无法和Source2完成时间范围内的匹配。 - 浮点型
[open]字段直接用=匹配存在精度问题,只要两个值的小数位存在微小差异就会匹配失败。 - JOIN的时间范围配置不符合滚动窗口的时间特征:滚动窗口的聚合结果事件的时间戳为窗口结束时间,你设置的
DATEDIFF(minute,Source1,Source2) BETWEEN 0 AND 5要求Source2的时间晚于Source1的时间,而实际最高价的发生时间是在窗口区间内,早于Source1的窗口结束时间,条件写反了。
最优实现方案(无需双流JOIN)
直接用TopOne按窗口分组排序获取最高价对应的整行数据,逻辑更简单性能更高:
WITH RankedData AS ( SELECT [open], EventEnqueuedUtcTime, -- 按5分钟滚动窗口分组,开盘价倒序排序取第一 TopOne() OVER (PARTITION BY TumblingWindow(minute, 5) ORDER BY [open] DESC) AS TopRecord FROM EventHubInputData TIMESTAMP BY EventEnqueuedUtcTime ) SELECT TopRecord.EventEnqueuedUtcTime AS 最高价发生时间, TopRecord.[open] AS 最高开盘价, -- 计算所属窗口的开始/结束时间,按需取即可 DATEADD(minute, -5, System.TimeStamp()) AS 窗口开始时间, System.TimeStamp() AS 窗口结束时间 INTO EventHubOutPutSQLDB FROM RankedData
保留原JOIN逻辑的修复版本
WITH Source1 AS ( SELECT -- 窗口结束时间作为时间槽标识 System.TimeStamp() as TimeSlot, max([open]) as MaxOpenPrice FROM EventHubInputData TIMESTAMP BY EventEnqueuedUtcTime GROUP BY TumblingWindow(minute,5) ), Source2 AS( SELECT EventEnqueuedUtcTime,[open] FROM EventHubInputDataDup TIMESTAMP BY EventEnqueuedUtcTime ), Source3 as ( select Source2.EventEnqueuedUtcTime as datetime, Source1.MaxOpenPrice, Source1.TimeSlot FROM Source1 JOIN Source2 ON -- 浮点型匹配加精度容错 ABS(Source2.[open] - Source1.MaxOpenPrice) < 0.0001 -- 修正时间范围:Source2的时间要落在Source1对应的5分钟窗口内 AND DATEDIFF(minute, Source2, Source1) BETWEEN 0 AND 5 ) SELECT datetime,MaxOpenPrice,TimeSlot INTO EventHubOutPutSQLDB FROM Source3
内容的提问来源于stack exchange,提问作者Sudharsan Kalyanakumar
相关产品推荐
相关产品推荐

