本文将向您介绍可在Flink CDC数据摄入作业的Transform模块表达式中使用的内置函数。
内置函数
Flink CDC数据摄入作业提供了丰富的内置函数,可以直接在transform模块中的projection和filter表达式中使用。
算术函数
函数 | 说明 |
numeric1 + numeric2 | 返回numeric1加上numeric2的值。 |
numeric1 - numeric2 | 返回numeric1减去numeric2的值。 |
numeric1 * numeric2 | 返回numeric1乘以numeric2的值。 |
numeric1 / numeric2 | 返回numeric1除以numeric2的值。 |
numeric1 % numeric2 | 返回numeric1对numeric2取模的值。 |
ABS(numeric) | 返回numeric的绝对值。 |
CEIL(numeric) | 返回numeric向上取整的值。 |
FLOOR(numeric) | 返回numeric向下取整的值。 |
ROUND(numeric, int) | 返回numeric四舍五入到小数点后n位的值。 |
UUID() | 生成一个全局唯一ID(UUID)字符串(例如“3d3c68f7-f608-473f-b60c-b0c44ad4cc4e”)。 使用RFC 4122 type 4方法伪随机生成。 |
时间函数
函数 | 说明 |
LOCALTIME | 返回当前时区下的本地时间,返回类型为 |
LOCALTIMESTAMP | 返回当前时区下的本地时间戳,返回类型为 |
CURRENT_TIME | 返回当前时区下的本地时间,与LOCALTIME相同。 |
CURRENT_DATE | 返回当前时区下的本地日期。 |
CURRENT_TIMESTAMP | 返回当前时区下的本地时间戳。返回类型为 |
NOW() | 返回当前时区下的本地时间戳,与CURRENT_TIMESTAMP相同。 |
DATE_FORMAT(timestamp, string) | 将传入的时间戳按指定的格式化字符串string进行格式化。 说明 格式化字符串与Java中的SimpleDateFormat格式兼容。 |
DATE_FORMAT_TZ(timestamp, string) | 将传入的时间格式化为给定时区的字符串。 说明
|
DATE_FORMAT_TZ(timestamp, string1[, string2]) | 将传入的时间转换为格式string1并且时区信息为string2的字符串。 说明 格式化字符串与Java中的SimpleDateFormat格式兼容。 |
TIMESTAMPADD(timeintervalunit, interval, timepoint) | 计算timepoint加上interval(单位timeintervalunit)之后的时间点。 timeintervalunit可被指定为SECOND、MINUTE、HOUR、DAY、MONTH或YEAR。 |
DATE_ADD(timestamp, integer, string) | 将传入的第一个参数timestamp(如果是无时区的时间,转换为第三个参数string对应时区的本地时间)添加第二个参数integer对应的天数后,转换为yyyy-MM-dd格式的字符串。 |
TIMESTAMPDIFF(timepointunit, timepoint1, timepoint2) | 计算timepoint1和timepoint2之间差距多少timepointunit单位。 timepointunit可被指定为SECOND、MINUTE、HOUR、DAY、MONTH或YEAR。 |
TO_DATE(string1[, string2]) | 将传入的日期字符串string1按string2指定的格式转化为DATE类型。 说明 在不指定格式化字符串string2时,默认采用 |
TO_TIMESTAMP(string1[, string2]) | 将传入的时间戳字符串string1按string2指定的格式转化为不带时区信息的TIMESTAMP类型。 说明 在不指定格式化字符串string2时,默认采用 |
TO_TIMESTAMP_LTZ(string1[, string2][, string3]) | 将传入的时间戳字符串string1按string2指定的格式转化为时区为string3的TIMESTAMP_LTZ类型。 说明
|
TO_TIMESTAMP_LTZ(bigint[, integer]) | 将传入的第一个参数(时间戳)转化为精度为第二个参数的TIMESTAMP_LTZ类型。 说明 第二个参数可以填写为0或者3。 |
FROM_UNIXTIME(numeric[, string]) | 将第一个参数作为UTC时区下1970-01-01 00:00:00后经过的秒数转换为时间戳,并根据第二个参数,返回一个指定格式的时间戳字符串。 说明 在不指定格式化字符串string时,默认采用 |
UNIX_TIMESTAMP() | 返回当前时间下的UNIX时间戳秒数。 |
UNIX_TIMESTAMP(string1[, string2]) | 将给定的日期时间字符串string1转换为另一个日期时间格式string2。 |
在进行projection和filter表达式求值时,可以保证其中每个子表达式所得到的时间点都一致。例如,NOW() AS t1, NOW() AS t2, NOW() AS t3得到的t1、t2、t3一定对应同一个时间戳,无论其求值时间和顺序如何。
字符串函数
函数 | 说明 |
string1 || string2 | 返回string1和string2拼接而成的字符串。 说明 此运算符与逻辑或运算符不同。 |
CHAR_LENGTH(string) | 返回string字符串中的字符数。 |
UPPER(string) | 返回string的大写形式字符串。 |
LOWER(string) | 返回string的小写形式字符串。 |
TRIM(string1) | 删除string两侧的空白字符。 |
REGEXP_REPLACE(string1, string2, string3) | 将string1中所有满足string2模式的子串替换为string3。 例如, |
SUBSTRING(string FROM integer1 [ FOR integer2 ]) | 返回string从第integer1到第integer2个字符的子串。 说明 在不提供 |
CONCAT(string1, string2,…) | 返回将string1、string2、…拼接在一起形成的新字符串。 例如, |
类型转换函数
您可以使用 CAST(<表达式> AS <类型>)语法进行显式强制类型转换。目前支持以下转换路径:
源类型 | 目标类型 | 说明 |
任何 | VARCHAR 重要 目前不可使用 | 任何类型的字段均可被转换为字符串。 |
NUMERIC STRING | BOOLEAN | 任何非数字0或FALSE字符串的字面量均会被转换为TRUE。 |
NUMERIC STRING | TINYINT | 结果会被截断到-128到127范围内。 |
NUMERIC STRING | SMALLINT | 结果会被截断到-32768到32767范围内。 |
NUMERIC STRING | INTEGER | 结果会被截断到-2147483648到2147483647范围内。 |
NUMERIC STRING | BIGINT | 结果会被截断到-9223372036854775808到9223372036854775807范围内。 |
NUMERIC STRING | FLOAT | |
NUMERIC | DOUBLE | |
NUMERIC | DECIMAL | |
STRING TIMESTAMP_TZ TIMESTAMP_LTZ | TIMESTAMP | 字符串必须为合法的ISO_LOCAL_DATE_TIME格式。 |
比较函数
除非特别说明,否则以下内置函数在输入参数包含NULL时均返回NULL。
函数 | 说明 |
value1 = value2 | 如果value1等于value2,则返回TRUE;否则返回FALSE。 |
value1 <> value2 | 如果value1不等于value2,则返回TRUE;否则返回FALSE。 |
value1 > value2 | 如果value1大于value2,则返回TRUE;否则返回FALSE。 |
value1 >= value2 | 如果value1大于或等于value2,则返回TRUE;否则返回FALSE。 |
value1 < value2 | 如果value1小于value2,则返回TRUE;否则返回FALSE。 |
value1 <= value2 | 如果value1小于或等于value2,则返回TRUE;否则返回FALSE。 |
value IS NULL | 如果value是NULL,则返回TRUE;否则返回FALSE。 |
value IS NOT NULL | 如果value不是NULL,则返回TRUE;否则返回FALSE。 |
value1 BETWEEN value2 AND value3 | 如果value1的值介于value2和value3之间,则返回TRUE;否则返回FALSE。 |
value1 NOT BETWEEN value2 AND value3 | 如果value1的值并非介于value2和value3之间,则返回TRUE;否则返回FALSE。 |
string1 LIKE string2 | 如果string2定义的正则表达式能在string1中匹配到(含子串匹配),则返回TRUE;否则返回FALSE。 |
string1 NOT LIKE string2 | 如果string2定义的正则表达式无法在string1中匹配到,则返回TRUE;否则返回FALSE。 |
value1 IN (value2 [, value3]* ) | 如果value1的值存在于[value2, value3, ...]列表中,则返回TRUE;否则返回FALSE。 |
value1 NOT IN (value2 [, value3]* ) | 如果value1的值不存在于[value2, value3, ...]列表中,则返回TRUE;否则返回FALSE。 |
LIKE 与 NOT LIKE 的匹配语义与 SQL 标准存在两点差异,容易造成误用:
• 模式为 Java 正则表达式,不是 SQL 的 % 与 _ 通配符。% 与 _ 会被当作正则字面量处理,不会展开为通配符。
• 采用子串匹配(Java 正则 find() 语义),只要模式能在字符串任意位置命中就返回 TRUE,不要求从头到尾完整匹配。例如 col LIKE 'V.*' 会匹配 V123、ABC_V、ABC_V123 等任何包含 V 的字符串,实际等价于 SQL 的 col LIKE '%V%'。
若需与 SQL LIKE 语义严格等价,可通过锚点 ^ 与 $ 限定匹配位置,对照如下:
SQL 写法 | 等价的 CDC 正则写法 | 含义 |
|
| 以 HSRS 开头(HSRS 后可为空) |
|
| 以 HSRS 结尾 |
|
| 包含 HSRS |
|
| 严格等于 HSRS |
|
| H 后接任意单字符再接 SRS |
(SQL 无直接对应) |
| 以 V 开头且后面至少一个字符 |
逻辑函数
函数 | 说明 |
boolean1 OR boolean2 | 如果boolean1和boolean2至少有一个为TRUE,则返回TRUE。 |
boolean1 AND boolean2 | 如果boolean1和boolean2均为TRUE,则返回TRUE。 |
NOT boolean | 如果boolean为TRUE,则返回FALSE;如果boolean是FALSE,则返回TRUE。 |
boolean IS FALSE | 如果boolean为TRUE,则返回FALSE;如果boolean是FALSE,则返回TRUE。 |
boolean IS NOT FALSE | 如果boolean为TRUE,则返回TRUE;如果boolean是FALSE,则返回FALSE。 |
boolean IS TRUE | 如果boolean为TRUE,则返回TRUE;如果boolean是FALSE,则返回FALSE。 |
boolean IS NOT TRUE | 如果boolean为TRUE,则返回FALSE;如果boolean是FALSE,则返回TRUE。 |
条件函数
函数 | 说明 |
CASE value WHEN value1_1 [, value1_2]* THEN RESULT1 (WHEN value2_1 [, value2_2 ]* THEN result_2)* (ELSE result_z) END | 依次检查value值是否等于WHEN子句给出的值,并返回第一个相等子句的RESULT值。 如果没有任何子句满足条件,则返回ELSE子句指定的值。如果没有指定ELSE子句,则返回NULL。 |
CASE WHEN condition1 THEN result1 (WHEN condition2 THEN result2)* (ELSE result_z) END | 依次检查value值是否满足每个WHEN子句给出的条件,并返回第一个满足条件子句的RESULT值。 如果没有任何子句满足条件,则返回ELSE子句指定的值。如果没有指定ELSE子句,则返回NULL。 |
COALESCE(value1 [, value2]*) | 返回[value1、value2、……]列表中第一个不为NULL的元素。如果列表中所有元素均为NULL,则返回NULL。 |
IF(condition, true_value, false_value) | 如果condition子句对应的条件为真,则返回true_value;否则返回false_value。 |
JSON 函数
自实时计算引擎 VVR 11.6 版本开始,您可以在数据摄入作业中使用Variant类型及相关函数。
函数 | 说明 |
PARSE_JSON(json_string[, allow_duplicate_keys]) | 将 JSON 字符串解析为 Variant。如果 JSON 字符串无效,将抛出错误。如果希望返回 NULL 而不是抛出错误, 请使用 如果输入的 JSON 字符串中存在重复的键,当 allowDuplicateKeys 为 true 时,解析器会保留最后一个出现的具有相同键的字段,否则当 allowDuplicateKeys 为 false 时,它会抛出一个错误。默认情况下, allowDuplicateKeys 的值为 false。 |
TRY_PARSE_JSON(json_string[, allow_duplicate_keys]) | 尽可能将 JSON 字符串解析为 Variant。如果 JSON 字符串无效,则返回 NULL。如果希望抛出错误而不是返回 NULL, 请使用 如果输入的 JSON 字符串中存在重复的键,当 allowDuplicateKeys 为 true 时,解析器会保留最后一个出现的具有相同键的字段,否则当 allowDuplicateKeys 为 false 时,它会抛出一个错误。默认情况下, allowDuplicateKeys 的值为 false。 |
JSON_EXISTS(json_string, json_path) | 判断JSON字符串中是否存在指定路径的对象,示例如下。 目前路径支持的符号及功能如下:
说明 仅实时计算引擎 VVR 11.7 及更高版本支持此函数。 |
JSON_VALUE(json_string, json_path) | 从JSON字符串中提取指定路径的对象,支持提取标量值或对象值。 说明 仅实时计算引擎 VVR 11.7 及更高版本支持此函数。 |
哈希函数
自实时计算引擎 VVR 11.6 版本开始,您可以在数据摄入作业中使用哈希函数。
函数 | 说明 |
MD5(string) | 以 32 位十六进制数字的字符串形式返回 string 的 MD5 哈希值;如果字符串为 |
SHA1(string) | 以 40 位十六进制数字的字符串形式返回 string 的 SHA-1 哈希值;如果字符串为 |
SHA224(string) | 以 56 位十六进制数字的字符串形式返回 string 的 SHA-224 哈希值;如果字符串为 |
SHA256(string) | 以 64 位十六进制数字的字符串形式返回 string 的 SHA-256 哈希值;如果字符串为 |
SHA384(string) | 以 96 位十六进制数字的字符串形式返回 string 的 SHA-384 哈希值;如果字符串为 |
SHA512(string) | 以 128 位十六进制数字的字符串形式返回 string 的 SHA-512 哈希值;如果字符串为 |
SHA2(string, hashLength) | 使用 SHA-2 系列散列函数(SHA-224,SHA-256,SHA-384 或 SHA-512)返回散列值。第一个参数 string 是要散列的字符串, 第二个参数 hashLength 是结果的位数(224,256,384 或 512)。如果 string 或 hashLength 为 |
AI函数
自实时计算引擎VVR 11.8.0 preview2版本开始,CDC YAML的Transform模块支持在projection表达式中使用AI函数。使用前需开通Flink AI服务(内置模型)。
函数 | 签名 | 返回字段 | 用途 |
AI_COMPLETE |
|
| 通用文本生成。 |
|
| 文本分类。 | |
|
| 文本翻译。 | |
|
| 文本摘要。 | |
|
| 情感分析。 | |
|
| 结构化信息提取。 | |
|
| 敏感信息脱敏。 | |
AI_EMBED |
|
| 将文本转换为向量,适用于多模态数据集打标、RAG 过滤检索、特征 Backfill 等场景。 说明 自实时计算引擎 VVR 11.9 后可用。 |
AI_IMAGE_COMPLETE |
|
| 根据图片和提示词生成文本,适用于图片内容识别、信息提取、分类等场景。 说明 自实时计算引擎 VVR 11.9 后可用。 |
AI_IMAGE_EMBED |
|
| 将图片转换为向量,适用于多模态数据集打标、RAG 过滤检索、特征 Backfill 等场景。 说明 自实时计算引擎 VVR 11.9 后可用。 |
在projection表达式中,通过['字段名']访问返回字段。例如:AI_COMPLETE('mymodel', content, '')['result']。
AI函数的详细使用方法和场景示例,请参见AI智能文本标注、配置并调用 AI Function。
多模态函数
函数签名 | 返回类型 | 说明 |
FETCH_CONTENT(uri) | BYTES | 从指定 URI 获取二进制内容,HTTP 请求失败时默认重试 3 次。 说明 仅实时计算引擎 VVR 11.8 及更高版本支持此函数。 |
FETCH_CONTENT(uri, httpRetryCount) | BYTES | 从指定 URI 获取二进制内容,并指定 HTTP 请求的重试次数。 说明 仅实时计算引擎 VVR 11.8 及更高版本支持此函数。 |
FFMPEG_VIDEO_FILTER(content, filters) | BYTES | 对图片或视频应用 FFmpeg 视频滤镜。图片默认输出 PNG,视频默认输出 MP4。 说明 仅实时计算引擎 VVR 11.9 及更高版本支持此函数。 |
FFMPEG_VIDEO_FILTER(content, filters, outputExtension) | BYTES | 对图片或视频应用 FFmpeg 视频滤镜,并指定输出格式。 说明 仅实时计算引擎 VVR 11.9 及更高版本支持此函数。 |
FFMPEG_AUDIO_FILTER(content, filters) | BYTES | 对音频流应用 FFmpeg 音频滤镜,默认输出 WAV。 说明 仅实时计算引擎 VVR 11.9 及更高版本支持此函数。 |
FFMPEG_AUDIO_FILTER(content, filters, outputExtension) | BYTES | 对音频流应用 FFmpeg 音频滤镜,并指定输出格式。 说明 仅实时计算引擎 VVR 11.9 及更高版本支持此函数。 |
访问嵌套类型数据
自实时计算引擎 VVR 11.6 版本开始,对于 ARRAY、MAP、VARIANT 等嵌套类型的数据字段,您可以使用 [] 操作符访问其中的特定元素。
访问方式
假设存在一个名为 nest_col 的嵌套类型字段,根据其内部数据格式的不同,访问方式如下:
数组格式(ARRAY/VARIANT)
说明:使用nest_col[integer]获取指定索引位置的元素(索引从 1 开始)。示例:若
nest_col的值为[{"id": 1, "name": "项目 A"}, {"id": 2, "name": "项目 B"}]。操作:执行
nest_col[1],返回结果为{"id": 1, "name": "项目 A"}。哈希表格式(MAP/VARIANT)
说明:使用
nest_col[string]获取指定键(Key)对应的值。示例:若
nest_col的值为{"id": 1, "name": "项目 A"}。操作:执行
nest_col['id'],返回结果为1。
对于复杂的嵌套类型数据,您可以重复使用[] 操作符以访问内部深层次嵌套元素。
示例:若 nest_col 的值为 [{"id": 1, "name": "项目 A"}, {"id": 2, "name": "项目 B"}]。
操作:执行 nest_col[1]['id'],返回结果为 1。
返回类型
使用 [] 操作符获取其中的特定元素的返回类型取决于原始嵌套类型字段的内部类型:
原始字段的类型为
ARRAY[T],内部类型为T
使用nest_col[integer]获取指定索引位置元素的返回类型为T。原始字段的类型为
MAP<K, V>,即键的类型为K,值的类型为T使用
nest_col[string]获取指定键对应元素的返回类型为V。原始字段的类型为
VARIANT使用
nest_col[integer]或者nest_col[string]访问元素的返回类型始终为VARIANT。