TL;DR InfluxDB 技术技巧——如何解析带注释的 CSV
作者:Anais Dotis-Georgiou / 用例,开发者,产品
2020年7月15日
导航至
在这篇文章中,我们分享如何解析 InfluxDB 的 带注释的 CSV,即 Flux 查询结果格式。
问:什么是带注释的 CSV?
答:带注释的 CSV 是 InfluxDB 2.0 中 Flux 查询的输出格式。例如,假设我们正在记录关于两个收容所“A”和“B”中“calico”和“tabby”猫的数量,包括“young”和“adult”猫的数据。数据布局如下所示
桶 | "cats-and-dogs" |
测量 | "cats" |
标签键 |
标签值 |
"shelter" | "A", "B" |
"type" | "calico", "tabby" |
字段键 |
"young", "adult" |
如果我们使用以下查询查询我们的数据
from(bucket: "cats-and-dogs")
|> range(start: 2020-05-15T00:00:00Z, stop: 2020-05-16T00:00:00Z)
|> filter(fn: (r) => r["_measurement"] == "cats")
|> filter(fn: (r) => r["_field"] == "adult")
|> filter(fn: (r) => r["shelter"] == "A")
|> filter(fn: (r) => r["type"] == "calico")
|> limit(n:2)
这就是我们的带注释的 CSV 结果
#group,false,false,true,true,false,false,true,true,true,true
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string,string
#default,_result,,,,,,,,,
,result,table,_start,_stop,_time,_value,_field,_measurement,shelter,type
,,0,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:50:33.262484Z,8,adult,cats,A,calico
,,0,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:51:48.852085Z,7,adult,cats,A,calico
理解注释
问:带注释 CSV 中的那些“带井号的标题”是什么意思?
答:首先,看起来像 CSV 标题的东西被称为 注释。按照顺序,有三个注释
#group
:一个布尔值,表示列是 分组键 的一部分。分组键是一组列,表中的每一行都具有相同的值。让我们看看true
和false
列之间的区别,或者说是分组键的一部分和不是分组键的部分。true
列:在上述示例查询中,我们通过单个字段类型进行了筛选,即adult
,一个"shelter"
标签,"A" 以及一个"type"
标签,"calico"
。这些值在行之间是恒定的,因此这些列被设置为true
。此外,在标签和字段中筛选单个值意味着所有我们的表都将属于同一个表。因此,对于此查询,table
列也是true
。由我们的范围定义的_start
和_stop
列,在行之间是恒定的,因此这些值也是true
。false
列:_time
和_value
列在行之间有不同的值,这就是为什么它们在#group
注释的值上接收false
的原因。
#datatype
:描述了列所表示的数据类型或行协议元素。#default
:用于空值的值。例如,如果我们将我们的查询分配给变量ourQuery
,此注释看起来像:#default,ourQuery,,,,,,,,,
由于 #group
注释特别复杂,让我们用另一个例子进一步研究它。想象一下,我们筛选了两个 "shelters"
。我们执行以下查询
from(bucket: "cats-and-dogs")
|> range(start: 2020-05-15T00:00:00Z, stop: 2020-05-16T00:00:00Z)
|> filter(fn: (r) => r["_measurement"] == "cats")
|> filter(fn: (r) => r["_field"] == "adult")
|> filter(fn: (r) => r["shelter"] == "A" or r["shelter"] == "B")
|> filter(fn: (r) => r["type"] == "calico")
|> limit(n:2)
我们的注释 CSV 看起来像
#group,false,false,true,true,false,false,true,true,false,true
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string,string
#default,_result,,,,,,,,,
,result,table,_start,_stop,_time,_value,_field,_measurement,shelter,type
,,0,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:50:33.262484Z,9,adult,cats,B,calico
,,0,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:51:48.852085Z,7,adult,cats,B,calico
,,1,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:50:33.262484Z,8,adult,cats,A,calico
,,1,2020-05-15T00:00:00Z,2020-05-16T00:00:00Z,2020-05-15T18:51:48.852085Z,7,adult,cats,A,calico
现在,shelter
列的 #group
注释是 false
。我们现在将有两个组键。这意味着我们的数据有两个表,因此同样地,"table" 列的 #group
注释也是 false
。
问:我可以如何使用注释 CSV 的功能?
答:你可以做几件事情
- 你可以使用 InfluxDB 2.0 UI 将数据导出为 CSV。
- 你可以使用 from.csv() 函数创建临时数据,或者如果你在 from.csv() 后使用 to(),你也可以将数据写入 InfluxDB。
问:我对 InfluxDB 和注释 CSV 感到困惑,我如何使用常规 CSV 和 InfluxDB 2.0?
答:有几种方法可以将常规 CSV 写入 InfluxDB。其中一些方法包括
提示:我鼓励您尝试不同的查询,并在InfluxDB 2.0 UI的原始数据查看器中查看注释CSV结果,因为注释CSV被分为列,这使得阅读更容易。