sql - 使用 BY TIMESTAMP 进行滚动窗口的 Azure 流分析查询在测试中工作正常,但在运行作业结果中关闭

标签 sql azure timestamp azure-stream-analytics

我正在开发一个物联网项目。我有一个 Raspberry pi,它将智能电表数据发送到 Azure 上的 IoT 事件中心。我使用 Azure 流分析作业读取数据。仪表读数每 10 秒发送一次。

我创建的查询之一使用滚动窗口计算每小时的耗电量。它使用滞后计算此窗口的最大仪表读数减去前一个窗口的最大仪表读数。我使用物联网设备的时间戳而不是默认到达时间。

WITH onehourwindow AS
(
SELECT
    max(total_low) * 1000 as max_low,
    max(total_high) * 1000 as max_high,
    max(gas) * 1000 as max_gas,
    round(avg(current_consumption), 1) as avg_consumption,
    max(timestamp) as max_timestamp
FROM
    eventhuninputsmartmeter TIMESTAMP BY timestamp
GROUP BY TUMBLINGWINDOW(hour, 1)
)

SELECT 
    (max_low - LAG(max_low) OVER (LIMIT DURATION(hour, 1))) / 1000 as total_consumption_low,
    (max_high - LAG(max_high) OVER (LIMIT DURATION(hour, 1))) / 1000 as total_consumption_high,    
    (max_gas - LAG(max_gas) OVER (LIMIT DURATION(hour, 1))) / 1000 as total_consumption_gas,
    avg_consumption,
    max_timestamp
INTO 
    MeterReadingSQLDB
FROM
    onehourwindow

查询返回测试中的预期结果。以下是测试结果中的时间戳和消耗的示例。正如预期的那样,最新时间戳(最大值)是该小时 59 分 50 秒左右的最后一次仪表读数。

|----------------------------|---------------------------|
|      max_timestamp         |    total_consumption_high |
|----------------------------|---------------------------|
|2020-02-28T22:59:52.1794730 |         1.171             |
|2020-02-28T21:59:51.6680430 |         0.500             |
|----------------------------|---------------------------|

当我运行查询作业时,我将以下结果写入 SQL 数据库。现在,最新时间戳 (max) 不是(时钟)小时的最后一次仪表读数,而是 54 分钟。如果我手动进行消耗计算,我可以看到使用的窗口是一小时,它只是不是从 00 开始,而是每小时 55 分钟开始。

|----------------------------|---------------------------|
|      max_timestamp         |    total_consumption_high |
|----------------------------|---------------------------|
|2020-02-28T22:54:52.1300000 |         1.353             |
|2020-02-28T21:54:51.6830000 |         0.510             |
|----------------------------|---------------------------|

如何解决这个问题?我已经尝试了很多方法,但似乎无法解决它。下面帖子的答案看起来很有希望,但我的事件不会迟到,绝对不会迟到 6 分钟。因此仍然使用默认的事件排序策略。

Azure Stream Analytics 'TimeStamp By' in query doesn't works on job but works fine on test

有什么想法可以解决此问题,以便我在 59 分 50 秒左右获得窗口的最大时间戳?

谢谢!

托马斯

最佳答案

根据您的详细描述:您的测试作业很好,输出了您想要的结果,我认为sql可能按预期工作。您可以考虑流数据源端的原因和ASA作业的设置。

I am using the timestamp from the IOT device instead of the default arrival time.

基于statements根据ASA TIMESTAMP BY文档,自定义时间戳可能会因网络或其他因素而导致延迟。

enter image description here

我建议您设置offsize Windows Function 中的参数来平衡这一差距。

关于sql - 使用 BY TIMESTAMP 进行滚动窗口的 Azure 流分析查询在测试中工作正常,但在运行作业结果中关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60460530/

相关文章:

c# - 仅获取容器中 Azure blob 文件的所有名称?

azure - 查询以获取失败请求的百分比 Azure Application Insights

php - 在 Flot Graph 中用 PHP 变量替换时间戳

python - 将带有时间的 Pandas 数据帧附加到 SQLite3 数据库并返回

java - 将以毫秒为单位的时间戳转换为以秒为单位的时间戳

sql - 如何在 T-SQL 中编写简单的插入或更新?

mysql - 我们如何将 AND & OR 运算符与简单连接一起使用?

python - 如何计算 Django 中同一模型的两个 m2m 关系的相关实体数量

mysql - HAVING 与子查询的效率及其原因

c# - 延迟消息并维护传递计数 Azure 服务总线