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

导航到

在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、解决方案、教程和问答,这些内容可能被您错过了,包括来自 GitHub、IRC 和 InfluxDB Google Group 的内容。

跨度量查询数据

问题: 我有两个度量:cow_groupscow_activity。我想在 cow_groups 中按标签进行 GROUP BY,并计算 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 子句中通过显式过滤器区分。

无法执行跨度量数学或分组。所有数据都必须位于单个度量中才能一起查询。我们建议重新组织您的 模式,以便所有数据都位于单个度量中。InfluxDB 不是关系型数据库,并且跨度量映射数据不是一种很好的模式。

推荐模式(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:20:00Z开始,而不是从2016-06-14T15:30: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用户组中自由提问。

接下来是什么?