Documentation

使用数学运算转换数据

此页面记录了 InfluxDB OSS 的早期版本。InfluxDB OSS v2 是最新的稳定版本。请参阅相应的 InfluxDB v2 文档: 使用数学运算转换数据

Flux支持数据转换中的数学表达式。 这篇文章描述了如何使用 Flux 算术运算符 在数据上“映射”并使用数学运算转换值。

如果您刚刚开始使用Flux查询,请查看以下内容:

基本数学运算
// Examples executed using the Flux REPL
> 9 + 9
18
> 22 - 14
8
> 6 * 5
30
> 21 / 7
3

查看 Flux read-eval-print-loop (REPL)

操作数必须是相同类型

Flux数学运算中的操作数必须是相同的数据类型。
例如,整数不能与浮点数一起进行运算。
否则,您将获得类似于以下内容的错误:

Error: type error: float != int

要将操作数转换为相同的类型,请使用 类型转换函数 或手动格式化操作数。操作数的数据类型决定了输出的数据类型。例如:

100 // Parsed as an integer
100.0 // Parsed as a float

// Example evaluations
> 20 / 8
2

> 20.0 / 8.0
2.5

自定义数学函数

Flux 允许你 创建自定义函数,使用数学运算。
查看下面的示例。

自定义乘法函数
multiply = (x, y) => x * y

multiply(x: 10, y: 12)
// Returns 120
自定义百分比函数
percent = (sample, total) => (sample / total) * 100.0

percent(sample: 20.0, total: 80.0)
// Returns 25.0

在数据流中转换值

要转换输入流中的多个值,您的函数需要:

下面的示例 multiplyByX() 函数包括:

  • 一个 tables 参数,表示输入数据流 (<-)。
  • 一个 x 参数,它是 _value 列中值乘以的数字。
  • 一个 map() 函数,它对输入流中的每一行进行迭代。 它使用 with 操作符来保留每一行中的现有列。 它还将 _value 列乘以 x
multiplyByX = (x, tables=<-) =>
  tables
    |> map(fn: (r) => ({
        r with
        _value: r._value * x
      })
    )

data
  |> multiplyByX(x: 10)

示例

将字节转换为千兆字节

要将活动内存从字节转换为千兆字节 (GB),将 mem 测量中的 active 字段除以 1,073,741,824。

map() 函数对管道传递的数据中的每一行进行迭代,并通过将原始 _value 除以 1073741824 来定义一个新的 _value

from(bucket: "db/rp")
  |> range(start: -10m)
  |> filter(fn: (r) =>
    r._measurement == "mem" and
    r._field == "active"
  )
  |> map(fn: (r) => ({
      r with
      _value: r._value / 1073741824
    })
  )

你可以将相同的计算转换为一个函数:

bytesToGB = (tables=<-) =>
  tables
    |> map(fn: (r) => ({
        r with
        _value: r._value / 1073741824
      })
    )

data
  |> bytesToGB()

包括部分千兆字节

因为原始指标(字节)是一个整数,所以操作的输出是一个整数,不包括部分GB。 要计算部分GB,请使用 float() 函数_value 列及其值转换为浮点数,并将除法操作中的分母格式化为浮点数。

bytesToGB = (tables=<-) =>
  tables
    |> map(fn: (r) => ({
        r with
        _value: float(v: r._value) / 1073741824.0
      })
    )

计算百分比

要计算百分比,请使用简单的除法,然后将结果乘以100。

> 1.0 / 4.0 * 100.0
25.0

有关计算百分比的深入研究,请参见 Calculate percentages

透视与连接

要在Flux中查询和使用数学运算中的值,操作数值必须存在于单行中。
pivot()join()都会这样做,但两者之间存在重要的区别:

数据透视表性能更高

pivot() 读取并操作单个数据流。join() 需要两个数据流,并且读取和组合这两个流的开销可能很大,特别是对于较大的数据集。

使用join连接多个数据源

在从不同的桶或数据源查询数据时使用 join()

将字段透视为列以进行数学计算
data
  |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
  |> map(fn: (r) => ({ r with
    _value: (r.field1 + r.field2) / r.field3 * 100.0
  }))
连接多个数据源进行数学计算
import "sql"
import "influxdata/influxdb/secrets"

pgUser = secrets.get(key: "POSTGRES_USER")
pgPass = secrets.get(key: "POSTGRES_PASSWORD")
pgHost = secrets.get(key: "POSTGRES_HOST")

t1 = sql.from(
  driverName: "postgres",
  dataSourceName: "postgresql://${pgUser}:${pgPass}@${pgHost}",
  query:"SELECT id, name, available FROM exampleTable"
)

t2 = from(bucket: "db/rp")
  |> range(start: -1h)
  |> filter(fn: (r) =>
    r._measurement == "example-measurement" and
    r._field == "example-field"
  )

join(tables: {t1: t1, t2: t2}, on: ["id"])
  |> map(fn: (r) => ({ r with _value: r._value_t2 / r.available_t1 * 100.0 }))


Flux的未来

Flux 正在进入维护模式。您可以像现在一样继续使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已公开Alpha测试

InfluxDB 3 Open Source is now available for alpha testing, licensed under MIT or Apache 2 licensing.

我们将发布两个产品作为测试版的一部分。

InfluxDB 3 核心,是我们新的开源产品。 它是一个用于时间序列和事件数据的实时数据引擎。 InfluxDB 3 企业版是建立在核心基础之上的商业版本,增加了历史查询能力、读取副本、高可用性、可扩展性和细粒度安全性。

有关如何开始的更多信息,请查看: