TL;DR InfluxDB 技术提示 - 在连续查询和原始 INTO 查询中对数据进行降采样

导航至

在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、解决方法、如何在连续查询和原始 INTO 查询中对数据进行降采样,以及来自 GitHub、IRC 和 InfluxDB Google Group 的问答,您可能错过了这些内容。

连续查询与原始 INTO 查询

问: 我想自动从一个测量中降采样数据,并将降采样后的数据保存在另一个测量中。我编写了一个连续查询 (CQ),但它似乎没有处理我的数据。我的语法是否正确,我对 CQ 的理解是否准确?

我的 CQ

> CREATE CONTINUOUS QUERY "downsample" ON "water_study" BEGIN SELECT max("sediment") INTO "downsampled_data" FROM "study1" WHERE time > now() - 1d GROUP BY time(30m),"quad" END

After I let it run for a while, I notice that InfluxDB never creates the measurement `downsampled_data`:
> SHOW MEASUREMENTS
name: measurements
------------------
name
study1 

Note that there are data in the original measurement `study1`:
> SELECT * FROM study1 LIMIT 4
name: study1
------------
time                  quad  sediment
2016-07-27T15:00:00Z  1     5
2016-07-27T15:00:00Z  4     7
2016-07-27T15:00:00Z  3     4
2016-07-27T15:00:00Z  2     3

答: 关注您的 CQ 中的 WHERE 子句,看起来您正尝试对旧数据执行 CQ,即时间戳发生在您创建 CQ 之前的数据。在您的 CQ 中包含 WHERE time > now() - 1d 将不起作用,原因有以下几点

  • CQ 忽略 WHERE 子句中的时间范围
  • CQ 仅在新数据上运行,即时间戳发生在您创建 CQ 之后的数据

要对旧数据进行降采样,请使用基本的 INTO 查询。与 CQ 不同,原始 INTO 查询接受 WHERE 子句中的时间范围,并且可以处理旧数据

> SELECT max("sediment") INTO "downsampled_data" FROM "study1" WHERE time > now() - 1d GROUP BY time(30m),"quad"
name: result
------------
time                  written
1970-01-01T00:00:00Z  8

> SELECT * FROM "downsampled_data" LIMIT 4
name: downsampled_data
----------------------
time                  max  quad
2016-07-27T15:00:00Z  6    1
2016-07-27T15:00:00Z  8    4
2016-07-27T15:00:00Z  4    3
2016-07-27T15:00:00Z  3    2

写入数据时的时间戳精度

问: 我可以使用 HTTP API 成功地将数据写入 InfluxDB,但我的时间戳始终与我期望的不符。我正在使用纪元时间 - Line Protocol 是否接受不同的时间戳格式?

写入时间戳为 2016 年 7 月 7 日 14:00:00 的数据

$ curl -POST "http://localhost:8086/write?db=test" --data-binary 'furniture futon=2 1469628000'

Query the data and see a timestamp in the 1970s:
> SELECT * FROM "furniture"
name: furniture
---------------
time                         futon
1970-01-01T00:00:01.469628Z  2

答: Line protocol 仅接受纪元时间戳,但默认情况下,它假定时间戳以纳秒为单位。但是,您的时间戳以秒为单位。使用查询字符串参数 precision 来指定替代时间戳精度

$ curl -POST "http://localhost:8086/write?db=test&precision=s" --data-binary 'furniture futon=2 1469628000'

> SELECT * FROM "furniture"
name: furniture
---------------
time                   futon
2016-07-27T14:00:00Z   2

查看 API 参考 以获取有关查询字符串参数的更多信息。

有关更多 InfluxDB 提示,请参阅我们的 常见问题解答页面,并随时在 InfluxDB 用户组中发布您的问题。

下一步是什么?