在Flux中提取标量值
此页面记录了早期版本的 InfluxDB OSS。InfluxDB OSS v2 是最新的稳定版本。参见等效的 InfluxDB v2 文档: 在 Flux 中提取标量值。
使用 Flux 动态查询函数 从 Flux 查询输出中提取标量值。这样你可以,例如,使用查询结果动态设置变量。
从输出中提取标量值:
本页面上的样本使用了下面提供的示例数据。
提取一个表格
Flux格式将查询结果表示为一系列表格。
要从一系列表格中提取一个标量值,您必须首先提取一个单一的表格。
从表的流中提取单个表。
如果查询结果只包含一个表,它仍然被格式化为一个表流。您仍然必须从流中提取该表。
使用 tableFind()
提取第一个表,其组键
值与fn 谓词函数匹配。
谓词函数需要一个key记录,表示每个表的组键。
sampleData
|> tableFind(fn: (key) =>
key._field == "temp" and
key.location == "sfo"
)
上面的示例返回一个单一的表格:
| 时间 | 位置 | 字段 | 值 |
|---|---|---|---|
| 2019-11-01T12:00:00Z | sfo | 温度 | 65.1 |
| 2019-11-01T13:00:00Z | sfo | 温度 | 66.2 |
| 2019-11-01T14:00:00Z | sfo | 温度 | 66.3 |
| 2019-11-01T15:00:00Z | sfo | 温度 | 66.8 |
提取正确的表
Flux函数不保证表的顺序,tableFind() 只返回匹配 fn 谓词的第一个表。要提取包含您实际需要的数据的表,请在谓词函数中非常具体,或过滤和转换您的数据,以最小化管道传递到 tableFind() 的表的数量。
从表中提取一列
使用getColumn() 函数从提取的表格中输出特定列的值数组。
sampleData
|> tableFind(fn: (key) =>
key._field == "temp" and
key.location == "sfo"
)
|> getColumn(column: "_value")
// Returns [65.1, 66.2, 66.3, 66.8]
使用提取的列值
使用变量来存储值的数组。 在下面的示例中, SFOTemps 代表值的数组。 在数组中引用特定索引(从 0 开始的整数)以返回该索引处的值。
SFOTemps = sampleData
|> tableFind(fn: (key) =>
key._field == "temp" and
key.location == "sfo"
)
|> getColumn(column: "_value")
SFOTemps
// Returns [65.1, 66.2, 66.3, 66.8]
SFOTemps[0]
// Returns 65.1
SFOTemps[2]
// Returns 66.3
从表中提取一行
使用 getRecord() 函数
从提取的表格中输出单行数据。
使用 idx 参数指定要输出的行的索引。
该函数输出每列的键值对记录。
sampleData
|> tableFind(fn: (key) =>
key._field == "temp" and
key.location == "sfo"
)
|> getRecord(idx: 0)
// Returns {
// _time:2019-11-11T12:00:00Z,
// _field:"temp",
// location:"sfo",
// _value: 65.1
// }
使用提取的行记录
使用变量来存储提取的行记录。 在下面的示例中, tempInfo 代表提取的行。 使用 点表示法 来引用记录中的键。
tempInfo = sampleData
|> tableFind(fn: (key) =>
key._field == "temp" and
key.location == "sfo"
)
|> getRecord(idx: 0)
tempInfo
// Returns {
// _time:2019-11-11T12:00:00Z,
// _field:"temp",
// location:"sfo",
// _value: 65.1
// }
tempInfo._time
// Returns 2019-11-11T12:00:00Z
tempInfo.location
// Returns sfo
示例辅助函数
创建自定义助手函数以从查询输出中提取标量值。
提取标量场值
// Define a helper function to extract field values
getFieldValue = (tables=<-, field) => {
extract = tables
|> tableFind(fn: (key) => key._field == field)
|> getColumn(column: "_value")
return extract[0]
}
// Use the helper function to define a variable
lastJFKTemp = sampleData
|> filter(fn: (r) => r.location == "kjfk")
|> last()
|> getFieldValue(field: "temp")
lastJFKTemp
// Returns 71.2
提取标量行数据
// Define a helper function to extract a row as a record
getRow = (tables=<-, field, idx=0) => {
extract = tables
|> tableFind(fn: (key) => true)
|> getRecord(idx: idx)
return extract
}
// Use the helper function to define a variable
lastReported = sampleData
|> last()
|> getRow(field: "temp")
"The last location to report was ${lastReported.location}.
The temperature was ${string(v: lastReported._value)}°F."
// Returns:
// The last location to report was kord.
// The temperature was 38.9°F.
示例数据
以下示例数据集代表从三个地点收集的虚构温度指标。它以注释CSV格式化,并使用csv.from()函数导入到Flux查询中。
在查询的开头放置以下内容以使用示例数据:
import "csv"
sampleData = csv.from(csv: "
#datatype,string,long,dateTime:RFC3339,string,string,double
#group,false,true,false,true,true,false
#default,,,,,,
,result,table,_time,location,_field,_value
,,0,2019-11-01T12:00:00Z,sfo,temp,65.1
,,0,2019-11-01T13:00:00Z,sfo,temp,66.2
,,0,2019-11-01T14:00:00Z,sfo,temp,66.3
,,0,2019-11-01T15:00:00Z,sfo,temp,66.8
,,1,2019-11-01T12:00:00Z,kjfk,temp,69.4
,,1,2019-11-01T13:00:00Z,kjfk,temp,69.9
,,1,2019-11-01T14:00:00Z,kjfk,temp,71.0
,,1,2019-11-01T15:00:00Z,kjfk,temp,71.2
,,2,2019-11-01T12:00:00Z,kord,temp,46.4
,,2,2019-11-01T13:00:00Z,kord,temp,46.3
,,2,2019-11-01T14:00:00Z,kord,temp,42.7
,,2,2019-11-01T15:00:00Z,kord,temp,38.9
")