TL;DR InfluxDB 技术技巧——如何解析带注释的 CSV

导航至

在这篇文章中,我们分享如何解析 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 标题的东西被称为 注释。按照顺序,有三个注释

  1. #group:一个布尔值,表示列是 分组键 的一部分。分组键是一组列,表中的每一行都具有相同的值。让我们看看 truefalse 列之间的区别,或者说是分组键的一部分和不是分组键的部分。
    • true 列:在上述示例查询中,我们通过单个字段类型进行了筛选,即 adult,一个 "shelter" 标签,"A" 以及一个 "type" 标签,"calico"。这些值在行之间是恒定的,因此这些列被设置为 true。此外,在标签和字段中筛选单个值意味着所有我们的表都将属于同一个表。因此,对于此查询,table 列也是 true。由我们的范围定义的 _start_stop 列,在行之间是恒定的,因此这些值也是 true
    • false 列:_time_value 列在行之间有不同的值,这就是为什么它们在 #group 注释的值上接收 false 的原因。
  2. #datatype:描述了列所表示的数据类型或行协议元素。
  3. #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 的功能?

答:你可以做几件事情

  1. 你可以使用 InfluxDB 2.0 UI 将数据导出为 CSV。
  2. 你可以使用 from.csv() 函数创建临时数据,或者如果你在 from.csv() 后使用 to(),你也可以将数据写入 InfluxDB。

问:我对 InfluxDB 和注释 CSV 感到困惑,我如何使用常规 CSV 和 InfluxDB 2.0?

答:有几种方法可以将常规 CSV 写入 InfluxDB。其中一些方法包括

提示:我鼓励您尝试不同的查询,并在InfluxDB 2.0 UI的原始数据查看器中查看注释CSV结果,因为注释CSV被分为列,这使得阅读更容易。

annotated CSV results InfluxDB