使用 filter() 根据字段、标签或任何其他列值查询数据。 filter() 执行的操作类似于 InfluxQL 和其他类似 SQL 的查询语言中的 SELECT 语句和 WHERE 子句。
from(bucket: "example-bucket")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "example-measurement" and r.tag == "example-tag")
|> filter(fn: (r) => r._field == "example-field")
阅读更多
使用 group() 来对特定列中具有相同值的数据进行分组。
data
|> group(columns: ["host"], mode: "by")
输入:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host1 | 1.0 |
| 2020-01-01T00:01:00Z | host2 | 2.0 |
| 2020-01-01T00:02:00Z | 主机1 | 1.0 |
| 2020-01-01T00:02:00Z | host2 | 3.0 |
输出:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host1 | 1.0 |
| 2020-01-01T00:02:00Z | 主机1 | 1.0 |
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host2 | 2.0 |
| 2020-01-01T00:02:00Z | host2 | 3.0 |
阅读更多
使用 sort() 按特定列对每个表中的记录进行排序,使用 limit() 将输出表中的记录数量限制为一个固定数目 n。
data
|> sort(columns: ["host", "_value"])
|> limit(n: 4)
输入:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | A | 1.0 |
| 2020-01-01T00:02:00Z | B | 1.2 |
| 2020-01-01T00:03:00Z | A | 1.8 |
| 2020-01-01T00:04:00Z | B | 0.9 |
| 2020-01-01T00:05:00Z | B | 1.4 |
| 2020-01-01T00:06:00Z | B | 2.0 |
输出:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:03:00Z | A | 1.8 |
| 2020-01-01T00:01:00Z | A | 1.0 |
| 2020-01-01T00:06:00Z | B | 2.0 |
| 2020-01-01T00:05:00Z | B | 1.4 |
阅读更多
本指南介绍了如何使用Flux对数据进行窗口处理和聚合,并概述了这一过程如何影响您的数据。
data
|> aggregateWindow(every: 20m, fn: mean)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:20:00Z | 195 |
| 2020-01-01T00:40:00Z | 200 |
| 2020-01-01T01:00:00Z | 290 |
| 2020-01-01T01:20:00Z | 340 |
阅读更多
Flux 提供了可以让你探索存储在 InfluxDB 中的数据结构和模式的函数。
import "influxdata/influxdb/schema"
// List buckets
buckets()
// List measurements
schema.measurements(bucket: "example-bucket")
// List field keys
schema.fieldKeys(bucket: "example-bucket")
// List tag keys
schema.tagKeys(bucket: "example-bucket")
// List tag values
schema.tagValues(bucket: "example-bucket", tag: "example-tag")
阅读更多
使用 map() 重新映射列值并应用数学操作。
data
|> map(fn: (r) => ({ r with _value: r._value * r._value }))
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 2 |
| 2020-01-01T00:02:00Z | 4 |
| 2020-01-01T00:03:00Z | 3 |
| 2020-01-01T00:04:00Z | 5 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 4 |
| 2020-01-01T00:02:00Z | 16 |
| 2020-01-01T00:03:00Z | 9 |
| 2020-01-01T00:04:00Z | 25 |
阅读更多
使用 pivot() 或 join() 和 map() 函数将操作数值对齐为行并计算百分比。
data
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(
fn: (r) => ({
_time: r._time,
_field: "used_percent",
_value: float(v: r.used) / float(v: r.total) * 100.0,
}),
)
输入:
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 已使用 | 2.5 |
| 2020-01-01T00:00:10Z | 已使用 | 3.1 |
| 2020-01-01T00:00:20Z | 已使用 | 4.2 |
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 总计 | 8.0 |
| 2020-01-01T00:00:10Z | 总计 | 8.0 |
| 2020-01-01T00:00:20Z | 总计 | 8.0 |
输出:
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 使用百分比 | 31.25 |
| 2020-01-01T00:00:10Z | 使用百分比 | 38.75 |
| 2020-01-01T00:00:20Z | 使用百分比 | 52.50 |
阅读更多
使用 increase() 来跟踪表中多个列的增加。这个函数在跟踪随时间变化而循环的计数值或定期重置的计数值时尤其有用。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 8 |
| 2020-01-01T00:04:00Z | 10 |
| 2020-01-01T00:05:00Z | 0 |
| 2020年1月1日00:06:00Z | 4 |
输出:
| 时间 | 值 |
|---|
| 2020年01月01日T00:02:00Z | 1 |
| 2020-01-01T00:03:00Z | 7 |
| 2020-01-01T00:04:00Z | 9 |
| 2020-01-01T00:05:00Z | 9 |
| 2020-01-01T00:06:00Z | 13 |
阅读更多
使用 movingAverage() 或 timedMovingAverage() 返回数据的移动平均值。
data
|> movingAverage(n: 3)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.2 |
| 2020-01-01T00:03:00Z | 1.8 |
| 2020-01-01T00:04:00Z | 0.9 |
| 2020-01-01T00:05:00Z | 1.4 |
| 2020-01-01T00:06:00Z | 2.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:03:00Z | 1.33 |
| 2020-01-01T00:04:00Z | 1.30 |
| 2020-01-01T00:05:00Z | 1.36 |
| 2020-01-01T00:06:00Z | 1.43 |
data
|> timedMovingAverage(every: 2m, period: 4m)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.2 |
| 2020-01-01T00:03:00Z | 1.8 |
| 2020-01-01T00:04:00Z | 0.9 |
| 2020-01-01T00:05:00Z | 1.4 |
| 2020-01-01T00:06:00Z | 2.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:02:00Z | 1.000 |
| 2020-01-01T00:04:00Z | 1.333 |
| 2020-01-01T00:06:00Z | 1.325 |
| 2020-01-01T00:06:00Z | 1.150 |
阅读更多
使用 derivative() 计算后续值之间的变化率,或使用 aggregate.rate() 计算每个时间窗口的平均变化率。如果点之间的时间间隔不同,这些函数将点标准化到一个共同的时间间隔,使得值易于比较。
data
|> derivative(unit: 1m, nonNegative: true)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:04:00Z | |
| 2020-01-01T00:12:00Z | |
| 2020-01-01T00:19:00Z | 10.0 |
| 2020-01-01T00:32:00Z | |
| 2020-01-01T00:51:00Z | 4.74 |
| 2020-01-01T01:00:00Z | 5.56 |
import "experimental/aggregate"
data
|> aggregate.rate(every: 20m, unit: 1m)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:20:00Z | |
| 2020-01-01T00:40:00Z | 10.0 |
| 2020-01-01T01:00:00Z | 4.74 |
| 2020-01-01T01:20:00Z | 5.56 |
阅读更多
使用 histogram() 创建带有 Flux 的累积分布图。
data
|> histogram(
column: "_value",
upperBoundColumn: "le",
countColumn: "_value",
bins: [100.0, 200.0, 300.0, 400.0],
)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250.0 |
| 2020-01-01T00:01:00Z | 160.0 |
| 2020-01-01T00:02:00Z | 150.0 |
| 2020-01-01T00:03:00Z | 220.0 |
| 2020-01-01T00:04:00Z | 200.0 |
| 2020-01-01T00:05:00Z | 290.0 |
| 2020-01-01T01:00:00Z | 340.0 |
输出:
| le | 值 |
|---|
| 100.0 | 0.0 |
| 200.0 | 3.0 |
| 300.0 | 6.0 |
| 400.0 | 7.0 |
阅读更多
使用 fill() 函数来替换 null 值。
data
|> fill(usePrevious: true)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 空 |
| 2020-01-01T00:04:00Z | 空 |
| 2020-01-01T00:05:00Z | 1.4 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 0.8 |
| 2020-01-01T00:04:00Z | 0.8 |
| 2020-01-01T00:05:00Z | 1.4 |
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 空 |
| 2020-01-01T00:04:00Z | 空 |
| 2020-01-01T00:05:00Z | 1.4 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 0.0 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 0.0 |
| 2020-01-01T00:04:00Z | 0.0 |
| 2020-01-01T00:05:00Z | 1.4 |
阅读更多
使用 median() 返回一个值,表示输入数据的 0.5 分位数(第50百分位)或中位数。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
阅读更多
使用quantile()函数返回输入数据中所有位于q分位数或百分位数的值。
data
|> quantile(q: 0.99, method: "estimate_tdigest")
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
阅读更多
本指南将介绍如何使用Flux连接数据,并概述这一过程中如何处理您的数据。
import "join"
import "sql"
left =
from(bucket: "example-bucket-1")
|> range(start: "-1h")
|> filter(fn: (r) => r._measurement == "example-m")
|> filter(fn: (r) => r._field == "example-f")
|> drop(columns: ["_measurement", "_field"])
right =
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://username:password@localhost:5432",
query: "SELECT * FROM example_table",
)
join.inner(
left: left |> group(),
right: right,
on: (l, r) => l.sensorID == r.ID,
as: (l, r) => ({l with expired: r.expired}),
)
|> group(columns: ["_time", "_value"], mode: "except")
输入:
左
| _时间 | 传感器ID | _值 |
|---|
| 2020-01-01T00:01:00Z | 1234 | 1 |
| 2020-01-01T00:02:00Z | 1234 | 2 |
| 2020-01-01T00:03:00Z | 1234 | 1 |
| 2020-01-01T00:04:00Z | 1234 | 3 |
| 时间 | 传感器ID | 值 |
|---|
| 2020-01-01T00:01:00Z | 5678 | 2 |
| 2020-01-01T00:02:00Z | 5678 | 5 |
| 2020-01-01T00:03:00Z | 5678 | 1 |
| 2020-01-01T00:04:00Z | 5678 | 8 |
右侧
| 身份证明 | 过期 | 已服务 |
|---|
| 1234 | 错误 | 2022-01-01 |
| 5678 | 真 | 2022-01-01 |
输出:
| 时间 | 传感器ID | 值 | 过期 |
|---|
| 2020-01-01T00:01:00Z | 1234 | 1 | 假 |
| 2020-01-01T00:02:00Z | 1234 | 2 | 假 |
| 2020-01-01T00:03:00Z | 1234 | 1 | 假 |
| 2020-01-01T00:04:00Z | 1234 | 3 | false |
| 时间 | 传感器ID | 值 | 过期 |
|---|
| 2020-01-01T00:01:00Z | 5678 | 2 | 是 |
| 2020-01-01T00:02:00Z | 5678 | 5 | 真 |
| 2020-01-01T00:03:00Z | 5678 | 1 | 真 |
| 2020-01-01T00:04:00Z | 5678 | 8 | 真 |
阅读更多
使用cumulativeSum()函数计算值的累计总和。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 1 |
| 2020-01-01T00:04:00Z | 3 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 3 |
| 2020-01-01T00:03:00Z | 4 |
| 2020-01-01T00:04:00Z | 7 |
阅读更多
使用 first() 或 last() 返回输入表中的第一个或最后一个点。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:04:00Z | 3.0 |
阅读更多
使用 Flux exists 操作符检查行记录是否包含某列,或该列的值是否为 null。
过滤空值
data
|> filter(fn: (r) => exists r._value)
阅读更多
创建您自己的自定义 Flux 函数以转换和操作数据。
multByX = (tables=<-, x) => tables
|> map(fn: (r) => ({r with _value: r._value * x}))
data
|> multByX(x: 2.0)
阅读更多
使用Flux动态查询函数从Flux查询输出中提取标量值。这让您可以,例如,使用查询结果动态设置变量。
scalarValue = (tables=<-) => {
_record = tables
|> findRecord(fn: (key) => true, idx: 0)
return _record._value
}
阅读更多
Flux 提供了多个函数来帮助监控数据中的状态和状态变化。
使用 Flux 处理和操作时间戳。
Flux sql 包提供用于处理 SQL 数据源的函数。使用 sql.from() 来查询 SQL 数据库,如 PostgreSQL、MySQL、Snowflake、SQLite、Microsoft SQL Server、Amazon Athena 和 Google BigQuery。
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://user:password@localhost",
query: "SELECT * FROM example_table",
)
阅读更多
本指南描述了如何使用Flux条件表达式,例如if、else和then,来查询和转换数据。Flux从左到右评估语句,一旦条件匹配就停止评估。
if color == "green" then "008000" else "ffffff"
阅读更多
本指南介绍了在Flux函数的评估逻辑中使用正则表达式。
data
|> filter(fn: (r) => r.tag =~ /^foo[1-3]/)
输入:
| 时间 | 标签 | 值 |
|---|
| 2020-01-01T00:01:00Z | foo1 | 1.0 |
| 2020-01-01T00:02:00Z | foo5 | 1.2 |
| 2020-01-01T00:03:00Z | bar3 | 1.8 |
| 2020-01-01T00:04:00Z | foo3 | 0.9 |
| 2020-01-01T00:05:00Z | foo2 | 1.4 |
| 2020-01-01T00:06:00Z | bar1 | 2.0 |
输出:
| 时间 | 标签 | 值 |
|---|
| 2020-01-01T00:01:00Z | foo1 | 1.0 |
| 2020-01-01T00:04:00Z | foo3 | 0.9 |
| 2020-01-01T00:05:00Z | foo2 | 1.4 |
阅读更多
使用 Flux Geo 包过滤地理时间数据,并按地理位置或轨迹进行分组。
import "experimental/geo"
sampleGeoData
|> geo.filterRows(region: {lat: 30.04, lon: 31.23, radius: 200.0})
|> geo.groupByArea(newColumn: "geoArea", level: 5)
阅读更多
使用 runtime.version() 返回安装在 InfluxDB 中的 Flux 版本。
import "array"
import "runtime"
array.from(rows: [{version: runtime.version()}])
阅读更多