【问题标题】:Grouping time-series data by time intervals按时间间隔对时间序列数据进行分组
【发布时间】:2016-10-13 02:20:10
【问题描述】:

假设我们正在为 1000 台设备存储数据,这些设备每 10 秒收集一种类型的数据。每个设备可以位于不同的时区。快速查询以可视化数据的能力很重要。我们可以向系统提出如下问题:

1. For a specific device, I want the last 7 days of data grouped by day totals for my local timezone.
2. For a specific device, I want the last year's data grouped by month totals for my local timezone.

以 UTC 格式存储所有数据似乎是最简洁的方法,但是在要求数据的本地分组时会变得很棘手。例如,每个时区的日期分组具有不同的偏移量。因此,如果我们要存储在日、月、年“桶”中,它们都将相对于 UTC 进行分组,这对于询问 UTC 本身以外的时区问题没有用处。

如果我们将数据按分钟和小时“桶”分组(忽略相差不到一小时的时区,例如 IST +5:30),我们可以使用小时“桶”来构建答案以上问题。对于问题 2,将有 12 个分组,每个分组最多包含 744 小时“桶”。

分钟和小时的方法(忽略相差不到一小时的时区,例如 IST +5:30)“桶”是否看起来像一个不错的设计?有没有人用不同的建议设计了类似的东西?

【问题讨论】:

  • 提供一个字段来存储每个设备的时区,例如Java 时区 ID,并支持基于本地日历的日历聚合 - 这种方法应该最适合上述场景。我会看看时间序列数据库。

标签: database time-series


【解决方案1】:

是的,按偏移量创建桶是一个合理的设计,这在数据仓库中经常发生(例如)。

尽管以 1 小时为增量进行分桶意味着忽略许多真实的地方。正如您所指出的,印度是一个使用:30 偏移量的位置。如果你想覆盖世界上每一个现代时区,你实际上需要 15 分钟的时间段,因为有几个是 :30:45 偏移量。

当然,如果您认为有误差范围是可以接受的,那么您可以使用您可以容忍的任何粒度。从理论上讲,你可以超过一个小时 - 你只会有更大的误差范围。

如果您想考虑不同的方法,可以使用设备的本地时间将值存储在date-time-offset 表单中。大多数数据库在索引此类值时会转换为 UTC,因此您可能还需要一个计算列来仅提取和索引本地时间部分。然后,您可以按当地时间分组,而不必知道它与 UTC 的关系。这种方法的缺点是数据固定在其原始时区。你不能轻易地重新组合来推断不同的时区。虽然如果这些是现实世界中的实际设备,那通常不是问题。

【讨论】:

猜你喜欢
  • 2021-07-07
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-04-29
相关资源
最近更新 更多