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

答:目前,InfluxDB 在 FOR 持续时间小于执行间隔时返回该错误。在您的案例中,执行间隔由 EVERY 持续时间确定,而不是由 GROUP BY time() 持续时间确定(因此,技术上错误应该说是 FOR duration 必须大于等于 EVERY duration)。

除了误导性的错误文字外,您收到错误的原因是因为您的连续查询会错过执行时间之间的数据。如果 max_pumpkins 按照当前的方式运行,它将每三小时执行一次查询(这是您的 EVERY 持续时间)。这个查询将覆盖从 now()now() - 2h 的时间(这是您的 FOR 持续时间) - 您将每三小时没有结果。为了避免数据覆盖的空白,您需要将 FOR 持续时间增加到 3h

如果此配置是故意的,有一个开放的功能请求,要求连续查询支持数据覆盖的空白。

使用连续查询创建子样本

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

原始数据(其中 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

我希望在另一个保留策略/度量中得到的数据

> 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

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

假设您的数据将以每10秒的间隔发生,以下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用户组 中提问!

下一步是什么?

  • 下载 并开始使用 InfluxDB!
  • 安排一次与解决方案架构师的免费 20分钟咨询,以审查您的 InfluxDB 项目。
  • 参加我们的免费 虚拟培训研讨会
  • 有问题需要立即从InfluxData支持团队获得答案吗?无限事件的订阅支持服务起步价仅为每月399美元。查看所有支持选项这里