TL;DR InfluxDB 技术技巧 - 使用 Kapacitor 比较数据
作者:Regan Kuchan / 开发者
2016年6月9日
导航至
在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、使用 Kapacitor 比较数据时的解决方案、来自 GitHub、IRC 和 InfluxDB Google Group 的教程和问答,这些您可能已经错过了。
使用相同的标签键和字段键查询数据
问:我能够成功写入数据,但当我尝试在 WHERE 子句中指定一个标签时,总是得到空响应。有什么建议吗?
写入数据
> INSERT candied,almonds=true almonds=50,half_almonds=51 1465317610000000000
> INSERT candied,almonds=true almonds=55,half_almonds=56 1465317620000000000
查看它们都在那里
> SELECT * FROM "candied"
name: candied
-------------
time almonds almonds_1 half_almonds
2016-06-07T16:40:10Z 50 true 51
2016-06-07T16:40:20Z 55 true 56
在 WHERE 子句中指定一个标签
> SELECT * FROM "candied" WHERE "almonds"='true'
> SELECT * FROM "candied" WHERE "almonds_1"='true'
>
答:您遇到问题是因为您的模式中包含匹配的标签键和字段键。
使用语法 almonds::tag='true'
在 WHERE 子句中指定 almonds 标签。
> SELECT * FROM "candied" WHERE "almonds"::tag='true'
name: candied
-------------
time almonds almonds_1 half_almonds
2016-06-07T16:40:10Z 50 true 51
2016-06-07T16:40:20Z 55 true 56
为了避免这种查询混淆,我们建议从您的模式中删除相同的标签键和字段键。根据您的其他数据和您计划如何查询数据,以下模式可能适用
> INSERT candied,status=full almonds=50 1465317610000000000
> INSERT candied,status=half almonds=51 1465317610000000000
> INSERT candied,status=full almonds=55 1465317620000000000
> INSERT candied,status=half almonds=56 1465317620000000000
> SELECT * FROM "candied"
name: candied
-------------
time almonds status
2016-06-07T16:40:10Z 50 full
2016-06-07T16:40:10Z 51 half
2016-06-07T16:40:20Z 55 full
2016-06-07T16:40:20Z 56 half
使用 Kapacitor 在时间上比较数据
问:我试图使用 Kapacitor 将上周的数据与本周的数据进行比较。我通过创建两个 var
(一个用于上周的数据,一个用于本周的数据),将 var
合并,并将合并后的数据写回 InfluxDB 来完成。
唯一的问题是 join
总是使用时间作为连接键 - 当然,两个 var
中的数据有不同的时间戳。有没有办法更改连接键或以其他方式合并这两组数据?
这是我的 TICKscript
var this_week = batch
| query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
.period(7d)
.groupBy(time(1d))
.every(30m)
var last_week = batch
| query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
.period(7d)
.groupBy(time(1d))
.every(30m)
.offset(7d)
this_week
|join(last_week)
.as('this_week','last_week')
|influxDBOut()
.database('caffeine')
.retentionPolicy('default')
.measurement('joined_coffee_data')
答:是的!使用 shift
使上周的时间戳匹配本周的时间戳,然后执行 join
。
var this_week = batch
| query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
.period(7d)
.groupBy(time(1d))
.every(30m)
var last_week = batch
| query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
.period(7d)
.groupBy(time(1d))
.every(30m)
.offset(7d)
// Shift the data to match this week's data ?
| shift(7d)
this_week
|join(last_week)
.as('this_week','last_week')
|influxDBOut()
.database('caffeine')
.retentionPolicy('default')
.measurement('joined_coffee_data')
转换功能
问:我已将所有数据都写为浮点数,但我想让查询返回整数。使用 InfluxQL 有什么方法可以实现这一点?
答:使用 <field_key>::<type>
语法将浮点数转换为整数。
例如
> INSERT blueberries value=20.890
> INSERT blueberries value=34.00812
> INSERT blueberries value=12.90
> SELECT "value"::integer FROM "blueberries"
name: blueberries
-----------------
time value
2016-06-07T18:43:52.875822901Z 20
2016-06-07T18:43:59.18983841Z 34
2016-06-07T18:44:07.778144875Z 12
更多 InfluxDB 技巧,请参阅我们的 常见问题解答 页面,并在 InfluxDB 用户组 中自由提问。