跳至主要內容

运算符和函数

大约 14 分钟

运算符和函数

本章介绍 IoTDB 支持的运算符和函数。IoTDB 提供了丰富的内置运算符和函数来满足您的计算需求,同时支持通过用户自定义函数能力进行扩展。

可以使用 SHOW FUNCTIONS 显示所有可用函数的列表,包括内置函数和自定义函数。

关于运算符和函数在 SQL 中的行为,可以查看文档 选择表达式

运算符列表

算数运算符

运算符含义
+取正(单目)
-取负(单目)
*
/
%取余
+
-

详细说明及示例见文档 算数运算符和函数

比较运算符

运算符含义
>大于
>=大于等于
<小于
<=小于等于
==等于
!= / <>不等于
BETWEEN ... AND ...在指定范围内
NOT BETWEEN ... AND ...不在指定范围内
LIKE匹配简单模式
NOT LIKE无法匹配简单模式
REGEXP匹配正则表达式
NOT REGEXP无法匹配正则表达式
IS NULL是空值
IS NOT NULL不是空值
IN / CONTAINS是指定列表中的值
NOT IN / NOT CONTAINS不是指定列表中的值

详细说明及示例见文档 比较运算符和函数

逻辑运算符

运算符含义
NOT / !取非(单目)
AND / & / &&逻辑与
OR/ | / ||逻辑或

详细说明及示例见文档 逻辑运算符

运算符优先级

运算符的优先级从高到低如下所示排列,同一行的运算符具有相同的优先级。

!, - (单目), + (单目)
*, /, DIV, %, MOD
-, +
=, ==, <=>, >=, >, <=, <, <>, !=
LIKE, REGEXP, NOT LIKE, NOT REGEXP
BETWEEN ... AND ..., NOT BETWEEN ... AND ...
IS NULL, IS NOT NULL
IN, CONTAINS, NOT IN, NOT CONTAINS
AND, &, &&
OR, |, ||

内置函数列表

列表中的函数无须注册即可在 IoTDB 中使用,数据函数质量库中的函数需要参考注册步骤进行注册后才能使用。

聚合函数

函数名功能描述允许的输入类型必要的属性参数输出类型
SUM求和。INT32 INT64 FLOAT DOUBLEDOUBLE
COUNT计算数据点数。所有类型INT64
AVG求平均值。INT32 INT64 FLOAT DOUBLEDOUBLE
EXTREME求具有最大绝对值的值。如果正值和负值的最大绝对值相等,则返回正值。INT32 INT64 FLOAT DOUBLE与输入类型一致
MAX_VALUE求最大值。INT32 INT64 FLOAT DOUBLE与输入类型一致
MIN_VALUE求最小值。INT32 INT64 FLOAT DOUBLE与输入类型一致
FIRST_VALUE求时间戳最小的值。所有类型与输入类型一致
LAST_VALUE求时间戳最大的值。所有类型与输入类型一致
MAX_TIME求最大时间戳。所有类型Timestamp
MIN_TIME求最小时间戳。所有类型Timestamp
COUNT_IF求数据点连续满足某一给定条件,且满足条件的数据点个数(用keep表示)满足指定阈值的次数。BOOLEAN[keep >=/>/=/!=/</<=]threshold:被指定的阈值或阈值条件,若只使用threshold则等价于keep >= threshold,threshold类型为INT64 ignoreNull:可选,默认为true;为true表示忽略null值,即如果中间出现null值,直接忽略,不会打断连续性;为false表示不忽略null值,即如果中间出现null值,会打断连续性INT64
TIME_DURATION求某一列最大一个不为NULL的值所在时间戳与最小一个不为NULL的值所在时间戳的时间戳差所有类型INT64
MODE求众数。注意: 1.输入序列的不同值个数过多时会有内存异常风险; 2.如果所有元素出现的频次相同,即没有众数,则返回对应时间戳最小的值; 3.如果有多个众数,则返回对应时间戳最小的众数。所有类型与输入类型一致

详细说明及示例见文档 聚合函数

数学函数

函数名输入序列类型输出序列类型必要属性参数Java 标准库中的对应实现
SININT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sin(double)
COSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#cos(double)
TANINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#tan(double)
ASININT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#asin(double)
ACOSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#acos(double)
ATANINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#atan(double)
SINHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sinh(double)
COSHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#cosh(double)
TANHINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#tanh(double)
DEGREESINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#toDegrees(double)
RADIANSINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#toRadians(double)
ABSINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致Math#abs(int) / Math#abs(long) /Math#abs(float) /Math#abs(double)
SIGNINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#signum(double)
CEILINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#ceil(double)
FLOORINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#floor(double)
ROUNDINT32 / INT64 / FLOAT / DOUBLEDOUBLEplaces:四舍五入有效位数,正数为小数点后面的有效位数,负数为整数位的有效位数Math#rint(Math#pow(10,places))/Math#pow(10,places)
EXPINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#exp(double)
LNINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#log(double)
LOG10INT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#log10(double)
SQRTINT32 / INT64 / FLOAT / DOUBLEDOUBLEMath#sqrt(double)

详细说明及示例见文档 算数运算符和函数

比较函数

函数名可接收的输入序列类型必要的属性参数输出序列类型功能类型
ON_OFFINT32 / INT64 / FLOAT / DOUBLEthreshold:DOUBLE类型BOOLEAN 类型返回ts_value >= threshold的bool值
IN_RANGEINT32 / INT64 / FLOAT / DOUBLElower:DOUBLE类型 upper:DOUBLE类型BOOLEAN类型返回ts_value >= lower && ts_value <= upper的bool值

详细说明及示例见文档 比较运算符和函数

字符串处理函数

函数名输入序列类型必要的属性参数输出序列类型功能描述
STRING_CONTAINSTEXTs: 待搜寻的字符串BOOLEAN判断字符串中是否存在s
STRING_MATCHESTEXTregex: Java 标准库风格的正则表达式BOOLEAN判断字符串是否能够被正则表达式regex匹配
LENGTHTEXTINT32返回字符串的长度
LOCATETEXTtarget: 需要被定位的子串
reverse: 指定是否需要倒序定位,默认值为false, 即从左至右定位
INT32获取target子串第一次出现在输入序列的位置,如果输入序列中不包含target则返回 -1
STARTSWITHTEXTtarget: 需要匹配的前缀BOOLEAN判断字符串是否有指定前缀
ENDSWITHTEXTtarget: 需要匹配的后缀BOOLEAN判断字符串是否有指定后缀
CONCATTEXTtargets: 一系列 K-V, key需要以target为前缀且不重复, value是待拼接的字符串。
series_behind: 指定拼接时时间序列是否在后面,默认为false
TEXT拼接字符串和target字串
SUBSTRINGTEXTfrom: 指定子串开始下标
for: 指定的字符个数之后停止
TEXT提取字符串的子字符串,从指定的第一个字符开始,并在指定的字符数之后停止。下标从1开始。from 和 for的范围是 INT32 类型取值范围。
REPLACETEXT第一个参数: 需要替换的目标子串
第二个参数:要替换成的子串
TEXT将输入序列中的子串替换成目标子串
UPPERTEXTTEXT将字符串转化为大写
LOWERTEXTTEXT将字符串转化为小写
TRIMTEXTTEXT移除字符串前后的空格
STRCMPTEXTTEXT用于比较两个输入序列,如果值相同返回 0 , 序列1的值小于序列2的值返回一个负数,序列1的值大于序列2的值返回一个正数

详细说明及示例见文档 字符串处理函数

数据类型转换函数

函数名必要的属性参数输出序列类型功能类型
CASTtype:输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT由输入属性参数type决定将数据转换为type参数指定的类型。

详细说明及示例见文档 数据类型转换

常序列生成函数

函数名必要的属性参数输出序列类型功能描述
CONSTvalue: 输出的数据点的值 type: 输出的数据点的类型,只能是 INT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXT由输入属性参数 type 决定根据输入属性 valuetype 输出用户指定的常序列。
PIDOUBLE常序列的值:πdouble 值,圆的周长与其直径的比值,即圆周率,等于 Java标准库 中的Math.PI
EDOUBLE常序列的值:edouble 值,自然对数的底,它等于 Java 标准库 中的 Math.E

详细说明及示例见文档 常序列生成函数

选择函数

函数名输入序列类型必要的属性参数输出序列类型功能描述
TOP_KINT32 / INT64 / FLOAT / DOUBLE / TEXTk: 最多选择的数据点数,必须大于 0 小于等于 1000与输入序列的实际类型一致返回某时间序列中值最大的k个数据点。若多于k个数据点的值并列最大,则返回时间戳最小的数据点。
BOTTOM_KINT32 / INT64 / FLOAT / DOUBLE / TEXTk: 最多选择的数据点数,必须大于 0 小于等于 1000与输入序列的实际类型一致返回某时间序列中值最小的k个数据点。若多于k个数据点的值并列最小,则返回时间戳最小的数据点。

详细说明及示例见文档 选择函数

区间查询函数

函数名输入序列类型属性参数输出序列类型功能描述
ZERO_DURATIONINT32/ INT64/ FLOAT/ DOUBLE/ BOOLEANmin:可选,默认值0 max:可选,默认值Long.MAX_VALUELong返回时间序列连续为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max
NON_ZERO_DURATIONINT32/ INT64/ FLOAT/ DOUBLE/ BOOLEANmin:可选,默认值0 max:可选,默认值Long.MAX_VALUELong返回时间序列连续不为0(false)的开始时间与持续时间,持续时间t(单位ms)满足t >= min && t <= max
ZERO_COUNTINT32/ INT64/ FLOAT/ DOUBLE/ BOOLEANmin:可选,默认值1 max:可选,默认值Long.MAX_VALUELong返回时间序列连续为0(false)的开始时间与其后数据点的个数,数据点个数n满足n >= min && n <= max
NON_ZERO_COUNTINT32/ INT64/ FLOAT/ DOUBLE/ BOOLEANmin:可选,默认值1 max:可选,默认值Long.MAX_VALUELong返回时间序列连续不为0(false)的开始时间与其后数据点的个数,数据点个数n满足n >= min && n <= max

详细说明及示例见文档 区间查询函数

趋势计算函数

函数名输入序列类型属性参数输出序列类型功能描述
TIME_DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE / BOOLEAN / TEXTINT64统计序列中某数据点的时间戳与前一数据点时间戳的差。范围内第一个数据点没有对应的结果输出。
DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致统计序列中某数据点的值与前一数据点的值的差。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DIFFERENCEINT32 / INT64 / FLOAT / DOUBLE与输入序列的实际类型一致统计序列中某数据点的值与前一数据点的值的差的绝对值。范围内第一个数据点没有对应的结果输出。
DERIVATIVEINT32 / INT64 / FLOAT / DOUBLEDOUBLE统计序列中某数据点相对于前一数据点的变化率,数量上等同于 DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。
NON_NEGATIVE_DERIVATIVEINT32 / INT64 / FLOAT / DOUBLEDOUBLE统计序列中某数据点相对于前一数据点的变化率的绝对值,数量上等同于 NON_NEGATIVE_DIFFERENCE / TIME_DIFFERENCE。范围内第一个数据点没有对应的结果输出。
DIFFINT32 / INT64 / FLOAT / DOUBLEignoreNull:可选,默认为true;为true时,前一个数据点值为null时,忽略该数据点继续向前找到第一个出现的不为null的值;为false时,如果前一个数据点为null,则不忽略,使用null进行相减,结果也为nullDOUBLE统计序列中某数据点的值与前一数据点的值的差。第一个数据点没有对应的结果输出,输出值为null

详细说明及示例见文档 趋势计算函数

采样函数

函数名可接收的输入序列类型必要的属性参数输出序列类型功能类型
EQUAL_SIZE_BUCKET_RANDOM_SAMPLEINT32 / INT64 / FLOAT / DOUBLE降采样比例 proportion,取值范围为(0, 1],默认为0.1INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶随机采样
EQUAL_SIZE_BUCKET_AGG_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1
type:取值类型有avg, max, min, sum, extreme, variance, 默认为avg
INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶聚合采样
EQUAL_SIZE_BUCKET_M4_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例的等分桶M4采样
EQUAL_SIZE_BUCKET_OUTLIER_SAMPLEINT32 / INT64 / FLOAT / DOUBLEproportion取值范围为(0, 1],默认为0.1
type取值为avgstendiscosprenextdis,默认为avg
number取值应大于0,默认3
INT32 / INT64 / FLOAT / DOUBLE返回符合采样比例和桶内采样个数的等分桶离群值采样
M4INT32 / INT64 / FLOAT / DOUBLE包含固定点数的窗口和滑动时间窗口使用不同的属性参数。包含固定点数的窗口使用属性windowSizeslidingStep。滑动时间窗口使用属性timeIntervalslidingStepdisplayWindowBegindisplayWindowEnd。更多细节见下文。INT32 / INT64 / FLOAT / DOUBLE返回每个窗口内的第一个点(first)、最后一个点(last)、最小值点(bottom)、最大值点(top)。在一个窗口内的聚合点输出之前,M4会将它们按照时间戳递增排序并且去重。

详细说明及示例见文档 采样函数

时间序列处理函数

函数名输入序列类型参数输出序列类型功能描述
CHANGE_POINTSINT32 / INT64 / FLOAT / DOUBLE/与输入序列的实际类型一致去除输入序列中的连续相同值

详细说明及示例见文档 时间序列处理

Lambda 表达式

函数名可接收的输入序列类型必要的属性参数输出序列类型功能类型
JEXLINT32 / INT64 / FLOAT / DOUBLE / TEXT / BOOLEANexpr是一个支持标准的一元或多元参数的lambda表达式,符合x -> {...}(x, y, z) -> {...}的格式,例如x -> {x * 2}, (x, y, z) -> {x + y * z}INT32 / INT64 / FLOAT / DOUBLE / TEXT / BOOLEAN返回将输入的时间序列通过lambda表达式变换的序列

详细说明及示例见文档 Lambda 表达式

条件表达式

表达式名称含义
CASE类似if else

详细说明及示例见文档 条件表达式

数据质量函数库

关于

对基于时序数据的应用而言,数据质量至关重要。基于用户自定义函数能力,IoTDB 提供了一系列关于数据质量的函数,包括数据画像、数据质量评估与修复等,能够满足工业领域对数据质量的需求。

快速上手

该函数库中的函数不是内置函数,使用前要先加载到系统中。 操作流程如下:

  1. 下载包含全部依赖的 jar 包和注册脚本 【点击下载】open in new window
  2. 将 jar 包复制到 IoTDB 程序目录的 ext\udf 目录下 (若您使用的是集群,请将jar包复制到所有DataNode的该目录下);
  3. 启动 IoTDB;
  4. 将注册脚本复制到 IoTDB 的程序目录下(与sbin目录同级的根目录下),修改脚本中的参数(如果需要)并运行注册脚本以注册 UDF。

已经实现的函数

  1. Data-Quality 数据质量
  2. Data-Profiling 数据画像
  3. Anomaly-Detection 异常检测
  4. Frequency-Domain 频域分析
  5. Data-Matching 数据匹配
  6. Data-Repairing 数据修复
  7. Series-Discovery 序列发现
  8. Machine-Learning 机器学习

Copyright © 2023 The Apache Software Foundation.
Apache and the Apache feather logo are trademarks of The Apache Software Foundation

Have a question? Connect with us on QQ, WeChat, or Slack. Join the community now.

We use Google Analytics to collect anonymous, aggregated usage information.