我正在使用 AWS Timestream 来存储 IoT 传感器数据,其中包括温度、湿度等测量值。我的用例涉及每小时从传感器收集数据,并且我需要计算每日平均值以用于报告和分析目的。
这是我用来计算特定传感器一周内每日平均值的查询示例:
常量参数 = {
查询字符串:`
选择
bin(时间, 1d) AS 天,
AVG(measure_value::double) AS daily_avg
来自“物联网”。“测试”
哪里
AND sensor_id = '${sensorId}'
AND time BETWEEN TIMESTAMP '${startWeek} 00:00:00'
AND TIMESTAMP '${endWeek} 23:59:59'
GROUP BY bin(time, 1d)
ORDER BY day ASC
`
}; const data =等待 timestreamquery.query(params).promise();
问题: 我正在争论计算和存储这些每日平均值的两种方法:
我的问题:
当前方法:我当前正在运行类似于下面的查询,以在需要时计算每日平均值:
常量参数 = {
查询字符串:`
选择
bin(时间, 1d) AS 天,
AVG(measure_value::double) AS daily_avg
来自“物联网”。“测试”
哪里
AND sensor_id = '${sensorId}'
AND time BETWEEN TIMESTAMP '${startWeek} 00:00:00'
AND TIMESTAMP '${endWeek} 23:59:59'
GROUP BY bin(time, 1d)
ORDER BY day ASC
`
}; const data =等待 timestreamquery.query(params).promise();
我希望这能很好地获得每日平均值。然而,随着数据的增长,我担心频繁查询大型数据集以获取实时仪表板可能会变得缓慢且昂贵。
计划的方法:我正在考虑两种选择:
首先,我建议您使用现有的选项进行小型 PoC,并研究其成本、实施的难易程度、维护的难易程度以及业务需求。
话虽如此,计划查询将非常容易地满足您的需要,并且如果您的指标/维度设置得当,成本不会是一个大问题,因为查询将仅读取当天索引的数据并会吐出可能是包含您需要的聚合数据的单行。如果您对“实时信息”的要求灵活到一天的时间跨度,我建议您使用它。
如果您需要真实数据(例如最近 24 小时的平均值),那么计划查询可能不是您所需要的。也许您可以使用 Apache Flink 之类的工具来读取包并以窗口方式计算平均值并将其存储在其他地方。但我建议,仅将 Flink 用于每日平均值,在我看来是过度设计。