TL;DR InfluxDB 技术提示 - 使用连续查询创建子样本

导航至

在本周的帖子中,我们回顾了与 InfluxDB 和 TICK-stack 相关的最有趣的问题、如何使用连续查询创建子样本、解决方法以及来自 GitHub、IRC 和 InfluxDB Google Group 中您可能在过去一周左右错过的问题。

更改字段的数据类型

问: 我可以更改字段的数据类型吗?

答: 目前,InfluxDB 对更改字段数据类型的支持非常有限。

<field_key>::<type> 语法支持将字段值从整数转换为浮点数,或从浮点数转换为整数。有关示例,请参阅类型转换操作。没有办法将浮点数或整数转换为字符串或布尔值(反之亦然)。

如果类型转换操作对您的用例来说过于有限,则有几种解决方法。请注意,这些解决方法不会更新已写入数据库的数据。

选项 1:将数据写入不同的字段

最简单的解决方法是开始将新的数据类型写入同一序列中的不同字段。

选项 2:处理分片系统

字段值类型在分片内不能不同,但它们可以在分片之间有所不同。

希望更改字段数据类型的用户可以使用 SHOW SHARDS 查询来识别当前分片的 end_time。如果点的时间戳发生在 end_time 之后,InfluxDB 将接受具有不同数据类型的写入现有字段。

请注意,这不会更改先前分片上字段的数据类型。有关这如何影响您的查询,请参阅 InfluxDB 如何处理跨分片的字段类型差异

解释 FOR duration 错误

问: 我正在尝试创建一个连续查询,但我一直收到错误(见下文)。它说我的 FOR 持续时间必须大于或等于我的 GROUP BY time() 持续时间 - 但我的 FOR 持续时间大于我的 GROUP BY time() 持续时间!有什么建议吗?

连续查询

CREATE CONTINUOUS QUERY "max_pumpkins" ON "sales"
RESAMPLE EVERY 3h FOR 2h
BEGIN
SELECT max("pumpkins") INTO "max_pumpkins" FROM "patch" GROUP BY time(1h)
END

错误

error parsing query: FOR duration must be >= GROUP BY time duration

答:目前,只要 FOR 持续时间小于执行间隔,InfluxDB 就会返回该错误。在您的情况下,执行间隔由 EVERY 持续时间而不是 GROUP BY time() 持续时间决定(因此,从技术上讲,错误应该说 FOR duration must be >= EVERY duration)。

除了误导性的错误措辞外,您收到错误的原因是因为您的连续查询会错过执行时间之间的数据。如果按原样运行 max_pumpkins,它将每三小时执行一次查询(这是您的 EVERY 持续时间)。该查询将涵盖 now()now() 减去两小时之间的时间(这是您的 FOR 持续时间) - 您最终将无法获得每三小时的结果。为了避免数据覆盖范围出现差距,您需要将 FOR 持续时间增加到 3h

如果此配置是故意的,则有一个开放功能请求,要求连续查询支持数据覆盖范围中的差距。

使用连续查询创建子样本

问: 我想使用连续查询将带有特定标签的数据从一个 measurement 移动到另一个 measurement 和保留策略。我不想以任何方式操作数据,但看起来连续查询需要聚合函数。有没有办法绕过这个限制?

原始数据(其中 zombies 是一个标签)

> SELECT * FROM "mydb"."two_days"."haunted_house"
name: haunted_house
-------------------
time                   scare_index   zombies
2016-10-05T20:00:00Z   3             false
2016-10-05T20:00:00Z   12            true
2016-10-05T20:10:00Z   6             false
2016-10-05T20:10:00Z   13            true
2016-10-05T20:20:00Z   2             false
2016-10-05T20:20:00Z   11            true

我想要在不同保留策略/measurement 中的内容

> SELECT * FROM "mydb"."seven_days"."zombie_effects"
name: haunted_house
-------------------
time                   scare_index   zombies
2016-10-05T20:00:00Z   12            true
2016-10-05T20:10:00Z   13            true
2016-10-05T20:20:00Z   11            true

答:连续查询确实需要一个函数,但不一定需要聚合函数。您可以使用选择器函数来满足函数要求,并且不会以任何方式更改数据。

假设您的数据将始终以十秒间隔出现,以下 CQ 将为您提供子样本

CREATE CONTINUOUS QUERY "true_zombie" ON "mydb"
RESAMPLE EVERY 20s FOR 20s
BEGIN
  SELECT first("scare_index")
  INTO "mydb"."seven_days"."zombie_effects"
  FROM "mydb"."two_days"."haunted_house"
  WHERE "zombies" = 'true' 
  GROUP BY time(10s),*
END

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

下一步是什么?