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 之前发生的旧数据。在您的 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,但我的时间戳始终不是我所期望的。我使用的是纪元时间 - 行协议接受不同的时间戳格式吗?

以 2016 年 7 月 7 日 14:00:00 的日期和时间写入数据

$ curl -POST "https://127.0.0.1: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

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

$ curl -POST "https://127.0.0.1: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 用户组 中自由提问。

接下来是什么?

  • 在您的基础设施上寻找 InfluxDB 集群?现在可免费评估 InfluxDB Enterprise Beta,开始使用。
  • 下载开始使用 InfluxDB 1.0 Beta 3
  • 安排与解决方案架构师进行 免费 20 分钟咨询,以审查您的 InfluxDB 项目
  • 参加我们免费的虚拟培训研讨会。