【问题标题】:DynamoDB Timeseries: Querying large timespans of dataDynamoDB Timeseries:查询大时间跨度的数据
【发布时间】:2021-12-30 20:25:48
【问题描述】:

我有一个简单的时序表:

{
  "n": "EXAMPLE", # Name, Hash Key
  "t": 1640893628, # Unix Timestamp, Range Key
  "v": 10 # Value being stored
}

每 15 分钟我将轮询数据并插入表中。如果我想查询 24 小时内的值,这很有效 - 这相当于总共 96 条记录。

现在,假设我想查询更大的时间跨度 - 1 年或 2 年。现在有数万条记录,并且(在我看来)定期进行是不切实际的。这将需要多个查询来检索更大的时间范围,这将对响应时间产生负面影响并且成本更高。

我已经想到了解决这个问题的几个潜在解决方案:

1. 复制另一个表中的数据,增量更大。例如,每 6 小时有一条记录的表。

2. 有另一个表来存储常见的查询结果,例如过去一周、一个月和一年(分别)的“EXAMPLE”记录。我会定期更新新表中的记录以保存主表中的每 N 条记录(总共 100 条)。比如:

{
  "n": "EXAMPLE#WEEKLY",
  "v": [
     {
       "t": 1640893628,
       "v": 10
     },
     {
       "t": 1640993628,
       "v": 15
     },
     ... 98 more.
  ]
}

我相信#2 是一种可靠的方法。在我看来,这将是一个足够普遍的问题,所以我很想听听其他人是如何解决这个问题的。

【问题讨论】:

    标签: time-series amazon-dynamodb dynamodb-queries


    【解决方案1】:

    如果您可以将 unix 时间戳转换为 ISO 8601 类型的字符串,例如 2021-12-31T09:27:58+00:00,则会出现更多选项。

    如果是这样,DynamoDB 的 begins_with key condition expression 让我们可以查询离散的日历时间段。例如,2021 年 12 月, 可使用n = id1 AND begins_with(t, "2021-12") 查询。几天和几小时都是一样的。我们可以通过添加更进一步 indexes 中的其他时段。 一些滚动窗口也是可能的:n = id1 AND t > [24 hours ago] 给了我们last 24h

    n (PK)        t (SK)                   hour_bucket (LSI1 SK)  week (LSI2 SK)
    id1           2021-12-31T10:45         2021-12-31T09-12       2021-52
    id1           2021-12-31T13:00         2021-12-31T13-15       2021-52
    id1           2022-06-01T22:00         2022-06-01T22-24       2022-01
    

    如果您正在寻找任意时间序列查询,您可以考虑 Athena,正如其他答案所建议的那样,或者 AWS 的无服务器 Timestream,这是一个“专门构建的时间序列数据库,每天可以轻松存储和分析数万亿个时间序列数据点。”

    【讨论】:

      【解决方案2】:

      您可以将表导出到 Amazon S3 并在导出的数据上运行 Amazon Athena。这是描述该过程的博客文章:https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 2012-09-08
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多