Fir*_*Dib 5 database sample time-series influxdb
我有一个问题,这限制了我很多。我们正在尝试通过对时间进行分组来对我们的数据进行采样。我们有数百万个点,并希望在给定的间隔内获取每第 N 个点。我们已经实施了一个解决方案,该解决方案计算此间隔中的时间差,然后根据它进行分组以接收正确的点数。
SELECT last(value) as value FROM measurement WHERE time >= '...' AND time <= '...' GROUP BY time(calculated_time) fill(none)
返回的点数似乎是正确的,但日期不正确。
查看以下结果:
无采样
> SELECT value FROM "measurement" WHERE time >= '2016-01-01T00:00:00Z' AND time <= '2017-01-01T00:00:00Z' LIMIT 5;
name: measurement
time value
---- -----
2016-01-01T00:00:00Z 61.111
2016-01-01T01:00:00Z 183.673
2016-01-01T02:00:00Z 200
2016-01-01T03:00:00Z 66.667
2016-01-01T04:00:00Z 97.959
Run Code Online (Sandbox Code Playgroud)
带采样
> SELECT last(value) as value FROM "measurement" WHERE time >= '2016-01-01T00:00:00Z' AND time <= '2017-01-01T00:00:00Z' GROUP BY time(23m) fill(none) LIMIT 5;
name: measurement
time value
---- -----
2015-12-31T23:44:00Z 61.111
2016-01-01T00:53:00Z 183.673
2016-01-01T01:39:00Z 200
2016-01-01T02:48:00Z 66.667
2016-01-01T03:57:00Z 97.959
Run Code Online (Sandbox Code Playgroud)
无论聚合函数中使用的时间如何,我都希望返回的数据具有与数据库中一样的正确时间戳。相反,返回的时间似乎是聚合时间的倍数。也就是说,如果我的聚合是GROUP BY time(7m)那么点似乎是 7 的倍数。
如果我的涌入问题没有解决方案,是否可以使用替代数据库来完成此任务?本示例中的数据是均匀分布的,但情况并非总是如此。通常它会随机分布(几秒到几分钟)。
对于任何仍然对 InfluxDB 2.0 感兴趣的人来说,引入了一种新的查询语言:Flux。
对于 Flux,有一个sample函数可以实现此解决方案(每 10 个元素进行采样):
from(bucket: "my-bucket")
|> range(start: 2016-01-01T00:00:00Z, stop: 2017-01-01T00:00:00Z)
|> filter(fn: (r) => r._measurement == "measurement")
|> filter(fn: (r) => r._field == "value")
|> sample(n: 10)
|> yield()
Run Code Online (Sandbox Code Playgroud)