我正在尝试设计一个具有时间序列数据的系统。以下是系统的要求:
以下是我的约束:
答案 0 :(得分:1)
你可以尝试Akumuli(警告:我是作者)。 Akumuli可以非常快速地执行聚合(亚毫秒),因为它是一个面向列的数据库,它会为您预先计算一些聚合。它可以执行您需要的所有查询,例如如果你的系列看起来像这样:
${measurement_name} city=${city_name} dept=${department_name} state=${state_name}
实际数据看起来像这样(例如,这是以瓦特为单位测量的功耗数据):
W city=Jersey_City state=New-Jersey dept=1
W city=Jersey_City state=New-Jersey dept=2
W city=Paris state=Iowa dept=1
W city=Paris state=Iowa dept=2
W city=Texas state=Texas dept=1
W city=Texas state=Texas dept=3
W city=Paris state=Arkansas dept=1
W city=Paris state=Arkansas dept=2
您可以使用以下查询汇总dept=1
和dept=2
代码的所有数据:
{
"aggregate": { "W": "sum" },
"range": { "from": "20170501T000000",
"to": "20170502T000000" },
"group-by": [ "dept" ],
"where": { "dept": [1, 2] }
}
您将获得每个部门的总和,但只包括部门1和部门。
您可以按城市划分:
{
"aggregate": { "W": "sum" },
"range": { "from": "20170501T000000",
"to": "20170502T000000" },
"group-by": [ "city" ],
}
您将获得每个城市名称的总和(将加入一个城市的所有部门)。当然,您可以使用where
子句按标签过滤。
如果您有多个同名城市(例如爱荷华州和阿肯色州的巴黎),您可以按城市和州分组价值:
{
"aggregate": { "W": "sum" },
"range": { "from": "20170501T000000",
"to": "20170502T000000" },
"group-by": [ "city", "state" ],
}
您将获得巴黎阿肯色州的一个价值和巴黎爱荷华州的另一个价值。
答案 1 :(得分:0)
您概述的汇总是相当标准的。很难找到不支持它们的数据库。
您可以尝试Axibase TSD。它可以在用户定义的时区中有效地计算具有多个维度的日历聚合(例如,每日总计)。如果您收集的指标是由最终用户活动驱动的,那么这将非常有用:
SELECT date_format(time, "yyyy-MMM-dd", "US/Eastern"),
entity AS 'city', SUM(value)
FROM "email.active_sessions"
WHERE datetime >= current_year
AND entity.tags.state = 'PA'
GROUP BY entity, PERIOD(1 DAY, "US/Eastern")
可以使用扩展的关键字/功能方便地指定间隔。以下是'(最后)周'的情况:
WHERE datetime >= previous_week AND datetime < current_week
有关其他示例,请参阅SQL docs。
ATSD可在大多数Linux发行版上运行,并且可以在独立模式和分布式模式下执行。
披露:我为Axibase工作。