Flux 数据模型
Flux 采用基于基本数据类型构建的基本数据模型。数据模型由表、记录、列和流组成。
记录
记录 是命名值的元组,并使用记录类型表示。
列
列 具有标签和数据类型。列的可用数据类型为
数据类型 | 描述 |
---|---|
bool | 布尔值,真或假。 |
uint | 无符号 64 位整数。 |
int | 有符号 64 位整数。 |
float | IEEE-754 64 位浮点数。 |
string | Unicode 字符序列。 |
bytes | 字节值序列。 |
time | 纳秒精度的瞬时时间。 |
duration | 纳秒精度的时间持续时间。 |
表
表 是具有一组通用列和组键的记录集。
组键是列的列表。表的组键表示分配给该表的整个数据集的子集。表中的所有记录对于作为组键一部分的每列都具有相同的值。这些常用值称为“组键值”,可以用一组键值对表示。
表的模式由其组键及其列的标签和类型组成。
表流
流 表示可能无限的表集。流使用其各自的组键分组为各个表。流中的每个表都具有唯一的组键值。
流使用流类型 stream[A] where A: Record
表示。组键在 Flux 类型系统中未显式建模。
缺失值(空值)
null
是一个预声明的标识符,表示缺失值或未知值。null
是构成空类型的唯一值。当基本类型的任何非布尔运算符的至少一个操作数是 null 时,它将返回 null。
将 null 视为未知值。下表解释了 null 值在表达式中的行为
表达式 | 计算结果为 | 原因 |
---|---|---|
null + 5 | null | 将 5 加到未知值仍然是未知值 |
null * 5 | null | 将未知值乘以 5 仍然是未知值 |
null == 5 | null | 我们不知道未知值是否等于 5 |
null < 5 | null | 我们不知道未知值是否小于 5 |
null == null | null | 我们不知道未知事物是否等于其他也是未知的事物 |
对未知事物进行运算会产生仍然是未知的事物。唯一不是这种情况的地方是在布尔逻辑中。由于布尔类型是可为空的,因此 Flux 实现了三值逻辑,作为处理具有 null 操作数的布尔运算符的一种方式。通过将 null 操作数解释为未知值,我们得到以下定义
- not null = null
- null or false = null
- null or true = true
- null or null = null
- null and false = false
- null and true = null
- null and null = null
由于记录使用记录类型表示,尝试访问记录中值未知或缺失的列也将返回 null。
根据上述定义,无法使用 ==
和 !=
运算符检查表达式是否为 null。如果它们的任何操作数是 null,这些运算符将返回 null。为了执行此类检查,Flux 提供了一个内置的 exists
运算符
- 如果
x
为 null,则exists x
返回 false - 如果
x
不为 null,则exists x
返回 true
转换
转换定义了对流的更改。转换可能会消耗输入流,并且始终生成新的输出流。输出流组键具有基于输入流的稳定输出顺序。特定顺序可能会在版本之间更改,但不被视为重大更改。
大多数转换为它们从输入流接收的每个表输出一个表。修改组键或值的转换会重新组合输出流中的表。当从产生副作用的函数构造转换时,转换会产生副作用。
转换使用函数类型表示。
匹配参数名称
某些转换(例如,map
和 filter
)使用高阶函数(接受其他函数的函数)表示。传递到函数中的每个参数都必须与为该函数定义的参数名称匹配。
例如,filter
接受 fn
,它接受一个名为 r
的参数
from(bucket: "db")
|> filter(fn: (r) => ...)
如果将参数从 r
重命名为 v
,则脚本将失败
from(bucket: "db")
|> filter(fn: (v) => ...)
// FAILS!: 'v' != 'r'.
由于 Flux 不支持位置参数,因此参数名称很重要。转换(在本例中为 filter
)必须知道 r
是参数名称才能成功调用该函数。
此页内容对您有帮助吗?
感谢您的反馈!