要点总结: InfluxDB 技术提示 - InfluxDB Kapacitor
作者:Regan Kuchan / 开发者
2016 年 5 月 26 日
导航至
在这篇文章中,我们回顾了本周最有趣的 InfluxDB Kapacitor 和 TICK-stack 相关问题、解决方法、操作指南和问答,这些内容来自 GitHub、IRC 和您可能错过的 InfluxDB Google Group。
使用 INTO 查询保留标签
问: 我正在使用 INTO
查询将数据移动到新的 measurement。InfluxDB 说它写入了正确数量的点,但是当我查询新 measurement 中的数据时,我缺少一个点。
在我的数据中,color
是一个标签,name
是一个字段。
> SELECT * FROM "french_bulldogs"
name: french_bulldogs
---------------------
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
> SELECT * INTO "all_dogs" FROM "french_bulldogs"
name: result
------------
time written
1970-01-01T00:00:00Z 3
> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time color name
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
nugget
发生了什么?
答: 如果您将 SELECT *
与 INTO
一起使用,InfluxDB 会将当前 measurement 中的任何标签转换为新 measurement 中的字段。这可能会导致 InfluxDB 覆盖先前由标签区分的点。
在您的情况下,当 InfluxDB 将数据写入 all_dogs
时,它会将 color
从标签转换为字段。因为 nugget
和 rumple
具有相同的时间戳,并且不再通过标签区分,所以 InfluxDB 使用 rumple
点覆盖了 nugget
点。
使用 GROUP BY *
将标签保留为带有 INTO
查询的标签
> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *
name: result
------------
time written
1970-01-01T00:00:00Z 3
> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time color name
2016-05-25T00:05:00Z peach nugget
2016-05-25T00:05:00Z grey rumple
2016-05-25T00:10:00Z black prince
Kapacitor 是否要流式传输
问: 我正在使用 Kapacitor 将流数据与移位的流数据连接起来,并将连接的数据写回 InfluxDB。如果偏移覆盖了很长的时间范围(例如,24 小时),这会起作用吗?Kapacitor 可以处理 RAM 中的数据量吗?
var current_data = stream
| from()
.measurement('sparkle_trees')
var previous_data = stream
| from()
.measurement('sparkle_trees')
| shift(24h)
current_data
|join(previous_data)
.tolerance(10s)
.as('current_data','previous_data')
|influxDBOut()
.database('enchanted_forest')
.retentionPolicy('default')
.measurement('joined_data')
答: 您的 TICKscript 可以工作,但实际上,这不是一个好主意。首先,每次您重新启动 Kapacitor 时,您都必须等待 24 小时才能进行任何连接。其次,您将不得不在 RAM 中缓冲 24 小时的数据;除非您的摄取速率非常小,否则这是不切实际的。
我们建议使用批处理任务而不是流任务。使用批处理任务,Kapacitor 可以简单地查询旧数据,并在 Kapacitor 首次启动时立即开始处理连接。此外,Kapacitor 只需要将单个批次的数据放入 RAM 中。
例如
var current_data = batch
| query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
.period(5m)
.every(5m)
var previous_data = batch
| query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
.period(5m)
.every(5m)
// Select data -24h from the current time
.offset(24h)
// Shift data to match current time
| shift(24h)
current_data
|join(previous_data)
.as('current_data','previous_data')
|influxDBOut()
.database('enchanted_forest')
.retentionPolicy('default')
.measurement('joined_data')
何时在查询中双引号标识符
问: 我已成功将数据写入 InfluxDB,但是当我查询数据时出现意外错误
> INSERT monsters exists=true
> SELECT exists FROM monsters
ERR: error parsing query: found EXISTS, expected identifier, string, number, bool at line 1, char 8
答: 字段键 exists
是一个 InfluxQL 关键字。也是 InfluxQL 关键字的标识符必须在查询中用双引号引起来
> SELECT "exists" FROM monsters
name: monsters
--------------
time exists
2016-05-25T00:36:01.714188435Z true
2016-05-25T00:36:19.30227374Z true
请参阅我们的文档以获取 InfluxQL 关键字的完整列表。
有关更多 InfluxDB 提示,请查看我们的常见问题页面,并随时在 InfluxDB 用户组中发布您的问题。
下一步是什么?
- 下载并开始使用 InfluxDB v0.13
- 与解决方案架构师安排 免费 20 分钟咨询,以审查您的 InfluxDB 项目
- 参加我们的免费 虚拟培训研讨会之一。
- 在您的基础设施上寻找 InfluxDB 集群?联系销售以获取 InfluxDB Enterprise 的演示以及定价信息。