TL;DR InfluxDB 技术提示 - 查询标签值、跨测量数据、理解时间戳

导航至

在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、解决方法、操作指南以及来自 GitHub、IRC 和 InfluxDB Google Group 的问答,您可能错过了。

跨测量处理数据

问: 我有两个测量:cow_groupscow_activity。我想 GROUP BY cow_groups 中的一个标签,并计算 cow_activity 中一个字段的平均值。

这是我的数据组织方式

> SELECT * FROM cow_groups
name: cow_groups
----------------
time                    cow_group_id           cow_id    value
2016-06-12T23:10:00Z    consistent producer    3         1
2016-06-12T23:10:00Z    food motivated         2         1
2016-06-12T23:10:00Z    food motivated         1         1
2016-06-12T23:10:00Z    cool kids              1         1

> SELECT * FROM cow_activity
name: cow_activity
------------------
time                    cow_id   grass_consump  milk_prod
2016-06-12T23:10:00Z    1        10             60
2016-06-12T23:10:00Z    3        9              70
2016-06-12T23:10:00Z    2        7              71

我知道 InfluxDB 不支持 JOIN,但有没有办法执行类似以下查询的操作?

SELECT mean("milk_prod") FROM "cow_activity" GROUP BY "cow_groups"."cow_group_id"

答: 您是对的。InfluxDB 0.9+ 不支持 JOIN。相反,给定测量中的所有序列都会自动合并,除非在 WHERE 子句或 GROUP BY 子句中通过显式过滤器区分。

没有办法执行跨测量的数学运算或分组。所有数据必须在单个测量下才能一起查询。我们建议重新组织您的 schema,以便您的所有数据都存在于一个测量中。InfluxDB 不是关系数据库,跨测量映射数据不是一个好的 schema。

推荐的 schema(cow_group_idcow_id 是标签)

> SELECT * FROM "cows"
name: cows
----------
time                  cow_group_id         cow_id  grass_consump   milk_prod
2016-06-12T23:10:00Z  consistent producer  3	   9		   70
2016-06-12T23:10:00Z  food motivated	   2	   7               71
2016-06-12T23:10:00Z  food motivated	   1	   10              60
2016-06-12T23:10:00Z  cool kids            1	   10              60

# That schema makes this query possible:

> SELECT mean("milk_prod") FROM "cows" GROUP BY "cow_group_id"
name: cows
tags: cow_group_id=consistent producer
time                  mean
----                  ----
1970-01-01T00:00:00Z  70

name: cows
tags: cow_group_id=cool kids
time                  mean
----                  ----
1970-01-01T00:00:00Z  60

name: cows
tags: cow_group_id=food motivated
time                  mean
----                  ----
1970-01-01T00:00:00Z  65.5

 

查询标签值

问: 我成功地将几个点写入数据库,简单的 SELECT * 查询有效,但是当我在 WHERE 子句中指定一个标签时,我没有得到任何结果。我错过了什么?

> INSERT farm,patch_id=1 blueberries=15 1465948800000000000
> INSERT farm,patch_id=2 blueberries=32 1465948800000000000
> INSERT farm,patch_id=1 blueberries=12 1465952400000000000
> SELECT * FROM "farm" 
name: farm
----------
time                  blueberries  patch_id
2016-06-15T00:00:00Z  15           1
2016-06-15T00:00:00Z  32           2
2016-06-15T01:00:00Z  12           1
> SELECT * FROM "farm" WHERE time <= now() + 5h and "patch_id"=1
> SELECT * FROM "farm" WHERE time <= now() + 5h and "patch_id"="1"
>

答: 使用单引号在 WHERE 子句中指定标签值:

> SELECT * FROM "farm" WHERE "patch_id"='1'
name: farm
----------
time                  blueberries	patch_id
2016-06-15T00:00:00Z  15                1
2016-06-15T01:00:00Z  12                1

理解 GROUP BY time() 查询返回的时间戳

问: 我的查询有一个 20 分钟的 GROUP BY time() 间隔,并在 WHERE 子句中指定了 20 分钟的时间范围。有趣的是,我得到了两个时间间隔的结果,而不是一个。这是怎么回事?

> SELECT max("cookies") FROM "my_kitchen" WHERE time >= '2016-06-14T15:30:00Z' and time <= '2016-06-14T15:40:00Z' GROUP BY time(20m)
name: my_kitchen
----------------
time                  max
2016-06-14T15:20:00Z  20
2016-06-14T15:40:00Z  18

答: 您得到两个结果是因为 InfluxDB 处理带有 GROUP BY time() 查询的时间边界的方式。

默认情况下,InfluxDB 返回四舍五入的日历时间边界。在您的情况下,InfluxDB 自动将 2016-06-14T15:20:00Z2016-06-14T15:30:00Z 分组为第一个 20 分钟间隔,将 2016-06-14T15:40:00Z2016-06-14T15:50:00Z 分组为下一个 20 分钟间隔。请注意,max 列中的结果仅考虑 WHERE 子句中时间范围内的数据。

您可以通过在 GROUP BY time() 子句中包含偏移间隔来更改默认的四舍五入日历时间边界。以下查询告诉 InfluxDB 在默认时间边界上增加十分钟,以便结果从 2016-06-14T15:30:00Z 而不是 2016-06-14T15:20:00Z 开始

> SELECT max("cookies") FROM "my_kitchen" WHERE time >= '2016-06-14T15:30:00Z' and time <= '2016-06-14T15:40:00Z' GROUP BY time(20m,10m)
name: my_kitchen
----------------
time                  max
2016-06-14T15:30:00Z  20

请查看 数据探索 以获取关于偏移间隔的文档。

有关更多 InfluxDB 提示,请查看我们的 常见问题解答 页面,并随时在 InfluxDB 用户组中发布您的问题。

下一步是什么?