流分析聚合窗口

时间:2018-12-13 04:46:56

标签: azure-eventhub azure-stream-analytics

我需要有关在扩展窗口上执行聚合时如何忽略旧事件的帮助\建议。我有流到事件中心的销售数据。 事件中心用作输入流。我需要产生两个指标 -30秒聚合(滚动) -一整天的总销售价值,即来自Gate打开的时间

门打开时间是可变的(动态的),因此我从斑点处读取参考数据集;并将Gateopen日期时间加入销售流。 在滚动窗口上进行30秒的汇总可以正常工作。 给定门打开是可变的;我目前正在使用具有30秒跳跃的12小时跳跃窗口,并尝试通过使用EventProcessDatetime> GateOpen逻辑来限制要聚合的事件。

SELECT 
        Dateadd(ss,-30,System.Timestamp )  AS TimeSliceUTCStart
        , System.Timestamp AS TimeSliceUTCEnd   
        , p.Section                                       AS Section
        , SUM(CASE WHEN p.Classification = 'Retail' 
                AND p.ActivityDateTime > p.GateOpen THEN p.[sales_amt_gross] ELSE 0 END)    AS SaleTotalRetail


   FROM FilteredBase p 
   GROUP BY 
          p.Section
            , HoppingWindow(Duration(Hour, 12), hop(second, 30),Offset(millisecond, -1)) 

问题:我正在从前一天\时间片汇总销售量。 总的来说,我想要达到的结果很简单。商店最多可以开放5,8,10或12小时。我们希望能够随着一天的进展了解实时播报中每个部分的销售情况。任何建议或技巧将不胜感激。

1 个答案:

答案 0 :(得分:0)

直觉上查询看起来不错,但是在幕后发生的是,Azure Stream Analytics使用的参考数据文件在每个时间窗口均有效。然后,当它看到前一天的晚上时,将使用当时存在的参考数据(这可能会使前一天的开放时间比较p.ActivityDateTime> p.GateOpen为True。

我按如下方式修改了查询(假设您每个部分每天有1个公开事件)。请让我知道这对你有没有用。如果没有,您是否可以发送一些示例数据,以便我可以相应地修改查询。我们将研究如何使这些查询更易于编写。

WITH thirdtysecReporting AS
(
    SELECT
        p.Section Section,
        DATETIMEFROMPARTS(DATEPART(year, System.Timestamp), DATEPART(month, System.Timestamp), DATEPART(day, System.Timestamp), 0, 0, 0, 0) as date,
        System.Timestamp Windowend,
        SUM(p.sales_amt_gross) thirtysecSales
    FROM input TIMESTAMP BY p.ActivityDateTime
    GROUP BY TumblingWindow(second, 30), p.Section
)

,hopping AS
(
    SELECT
        Section,
        System.Timestamp HopEnd,
        date,
        SUM(thirtysecSales) SumSales
    FROM thirdtysecReporting
    GROUP BY HoppingWindow(second, 86400, 30), Section, date -- Hopping on 24 hours, reported every 30 second
)

,filtered as -- This step ignores data from the previous day
(
    SELECT 
        Section,
        HopEnd,
        date,
        SUMQt = CASE
            WHEN DAY(HopEnd) = DAY(date) OR DATEPART(hour, HopEnd) = DATEPART(hour, date) THEN SumSales
            ELSE 0
        END
    FROM hopping
)

SELECT Section, -- Final query
        HopEnd,
        MAX(SUMQt) AS SumQt
FROM filtered
GROUP BY TumblingWindow(hour, 1), Section, hopend

谢谢

JS-Azure流分析