TL;DR InfluxDB 技术提示 - 查询标签值、跨测量数据、理解时间戳
作者:Regan Kuchan / 开发者
2016 年 6 月 16 日
导航至
在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、解决方法、操作指南以及来自 GitHub、IRC 和 InfluxDB Google Group 的问答,您可能错过了。
跨测量处理数据
问: 我有两个测量:cow_groups
和 cow_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_id
和 cow_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:00Z
和 2016-06-14T15:30:00Z
分组为第一个 20 分钟间隔,将 2016-06-14T15:40:00Z
和 2016-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 用户组中发布您的问题。
下一步是什么?
- 下载 并 开始使用 InfluxDB v1.0 Beta
- 与解决方案架构师安排 免费 20 分钟咨询,以审查您的 InfluxDB 项目
- 参加我们的免费 虚拟培训研讨会。
- 在您的基础设施上寻找 InfluxDB 集群?联系销售 以获取 InfluxDB Enterprise 的演示和定价信息。