【翻译】Flink Table Api & SQL — 内置函数

时间:2019-11-20
本文章向大家介绍【翻译】Flink Table Api & SQL — 内置函数,主要包括【翻译】Flink Table Api & SQL — 内置函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

本文翻译自官网:Built-In Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/functions.html

Flink Table API和SQL为用户提供了一组用于数据转换的内置函数。此页面简要概述了它们。如果尚不支持所需的功能,则可以实现用户定义的功能如果您认为该功能足够通用,请为此打开Jira问题,并提供详细说明。

标量函数

标量函数将零个,一个或多个值作为输入,并返回一个值作为结果。

比较功能

比较功能描述
ANY1 === ANY2

如果ANY1等于ANY2 返回true; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY1 !== ANY2

如果ANY1不等于ANY2 返回true; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY1 > ANY2

如果 ANY1大于ANY2 返回TRUE; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY1 >= ANY2

如果 ANY1大于或等于ANY2返回TRUE ; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY1 < ANY2

如果 ANY1小于ANY2返回TRUE ; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY1 <= ANY2

如果ANY1小于或等于ANY2 返回TRUE; 如果ANY1ANY2为NULL,则返回UNKNOWN 

ANY.isNull

如果ANY为NULL,则返回TRUE 

ANY.isNotNull

如果ANY不为NULL,则返回TRUE 

STRING1.like(STRING2)

如果STRING1匹配模式STRING2则返回TRUE 如果STRING1STRING2为NULL,则返回UNKNOWN 

例如,"JoKn".like("Jo_n%")返回TRUE。

STRING1.similar(STRING2)

如果STRING1与SQL正则表达式STRING2匹配,则返回TRUE 如果STRING1STRING2为NULL,则返回UNKNOWN 

例如,"A".similar("A+")返回TRUE。

ANY1.in(ANY2, ANY3, ...)

如果ANY1存在于给定列表(ANY2,ANY3,...)中,则返回TRUE 

(ANY2,ANY3,...)包含NULL,如果可以找到该元素,则返回TRUE,否则返回UNKNOWN。

如果ANY1为NULL,则始终返回UNKNOWN 。

例如,4.in(1, 2, 3)返回FALSE。

ANY.in(TABLE)

如果ANY等于子查询TABLE返回的行,则返回TRUE 

注意:对于流查询,该操作将在联接和分组操作中重写。

根据不同输入行的数量,计算查询结果所需的状态可能会无限增长。

请提供具有有效保留间隔的查询配置,以防止出现过多的状态。有关详细信息,请参见查询配置

ANY1.between(ANY2, ANY3)

如果ANY1大于或等于ANY2和小于或等于ANY3 返回trueANY2ANY3为NULL时,返回FALSE或UNKNOWN。

例如,12.between(15, 12)返回FALSE; 12.between(10, Null(Types.INT))返回UNKNOWN; 12.between(Null(Types.INT), 10)返回FALSE。

ANY1.notBetween(ANY2, ANY3)

如果ANY1小于ANY2或大于ANY3 返回trueANY2ANY3为NULL时,返回TRUE或UNKNOWN。

例如,12.notBetween(15, 12)返回TRUE;12.notBetween(Null(Types.INT), 15)返回UNKNOWN;12.notBetween(15, Null(Types.INT))返回TRUE。

逻辑函数

逻辑功能描述
BOOLEAN1 || BOOLEAN2

如果BOOLEAN1为TRUE或BOOLEAN2为TRUE,返回TRUE。支持三值逻辑。

例如,true || Null(Types.BOOLEAN)返回TRUE。

BOOLEAN1 && BOOLEAN2

如果BOOLEAN1BOOLEAN2均为TRUE,则返回TRUE。支持三值逻辑。

例如,true && Null(Types.BOOLEAN)返回未知。

!BOOLEAN

如果BOOLEAN为FALSE,则返回TRUE 如果BOOLEAN为TRUE,则返回FALSE 

如果BOOLEAN为UNKNOWN,则返回UNKNOWN。

BOOLEAN.isTrue

如果BOOLEAN为TRUE,则返回TRUE;如果BOOLEAN为FALSE或UNKNOWN,则返回FALSE 

BOOLEAN.isFalse

如果BOOLEAN为FALSE,则返回TRUE 如果BOOLEAN为TRUE或UNKNOWN,则返回FALSE 

BOOLEAN.isNotTrue

如果BOOLEAN为FALSE或UNKNOWN,则返回TRUE 如果BOOLEAN为TRUE,则返回FALSE 

BOOLEAN.isNotFalse

如果BOOLEAN为TRUE或UNKNOWN,则返回TRUE 如果BOOLEAN为FALSE,则返回FALSE。

算术函数

算术函数描述
+ NUMERIC

返回NUMERIC

- NUMERIC

返回负数NUMERIC

NUMERIC1 + NUMERIC2

返回NUMERIC1NUMERIC2

NUMERIC1 - NUMERIC2

返回NUMERIC1减去NUMERIC2

NUMERIC1 * NUMERIC2

返回NUMERIC1乘以NUMERIC2

NUMERIC1 / NUMERIC2

返回NUMERIC1除以NUMERIC2

NUMERIC1.power(NUMERIC2)

返回NUMERIC1NUMERIC2 次幂

NUMERIC.abs()

返回NUMERIC的绝对值

NUMERIC1 % NUMERIC2

返回NUMERIC1除以NUMERIC2的余数(模)仅当numeric1为负数时,结果为负数。

NUMERIC.sqrt()

返回NUMERIC的平方根

NUMERIC.ln()

返回NUMERIC的自然对数(以e为底)

NUMERIC.log10()

返回NUMERIC的以10为底的对数

NUMERIC.log2()

返回NUMERIC的以2为底的对数

NUMERIC1.log()
NUMERIC1.log(NUMERIC2)

如果不带参数调用,则返回NUMERIC1的自然对数当使用参数调用时,将NUMERIC1的对数返回到基数NUMERIC2

注意:当前,NUMERIC1必须大于0,而NUMERIC2必须大于1。

NUMERIC.exp()

返回e 的 NUMERIC 次

NUMERIC.ceil()

NUMERIC向上舍入,并返回大于或等于NUMERIC的最小整数

NUMERIC.floor()

向下舍入NUMERIC,并返回小于或等于NUMERIC的最大整数

NUMERIC.sin()

返回NUMERIC的正弦值

NUMERIC.sinh()

返回NUMERIC的双曲正弦值

返回类型为DOUBLE

NUMERIC.cos()

返回NUMERIC的余弦值

NUMERIC.tan()

返回NUMERIC的正切

NUMERIC.tanh()

返回NUMERIC的双曲正切值

返回类型为DOUBLE

NUMERIC.cot()

返回NUMERIC的余切

NUMERIC.asin()

返回NUMERIC的反正弦值

NUMERIC.acos()

返回NUMERIC的反余弦值

NUMERIC.atan()

返回NUMERIC的反正切

atan2(NUMERIC1, NUMERIC2)

返回坐标的反正切(NUMERIC1,NUMERIC2)

NUMERIC.cosh()

返回NUMERIC的双曲余弦值

返回值类型为DOUBLE

NUMERIC.degrees()

返回弧度NUMERIC的度数表示形式

NUMERIC.radians()

返回度数NUMERIC的弧度表示

NUMERIC.sign()

返回NUMERIC的符号

NUMERIC.round(INT)

返回一个数字,四舍五入NUMERIC的INT小数位

pi()

返回一个比pi更接近其他值的值。

e()

返回一个比任何其他值都更接近e的值。

rand()

返回介于0.0(含)和1.0(不含)之间的伪随机双精度值。

rand(INTEGER)

返回带有初始种子INTEGER的介于0.0(含)和1.0(不含)之间的伪随机双精度值

如果两个RAND函数具有相同的初始种子,它们将返回相同的数字序列。

randInteger(INTEGER)

返回介于0(含)和INTEGER(不含)之间的伪随机整数值

randInteger(INTEGER1, INTEGER2)

返回介于0(含)和INTEGER2不含)之间的伪随机整数值,其初始种子为INTEGER1

如果两个randInteger函数具有相同的初始种子和边界,它们将返回相同的数字序列。

uuid()

根据RFC 4122 type 4(伪随机生成)UUID返回UUID(通用唯一标识符)字符串

(例如,“ 3d3c68f7-f608-473f-b60c-b0c44ad4cc4e”)。使用加密强度高的伪随机数生成器生成UUID。

INTEGER.bin()

以二进制格式返回INTEGER的字符串表示形式。如果INTEGER为NULL,则返回NULL。

例如,4.bin()返回“ 100”并12.bin()返回“ 1100”。

NUMERIC.hex()
STRING.hex()

以十六进制格式返回整数NUMERIC值或STRING的字符串表示形式。如果参数为NULL,则返回NULL。

例如,数字20导致“ 14”,数字100导致“ 64”,字符串“ hello,world”导致“ 68656C6C6F2C776F726C64”。

字符串函数

字符串函数描述
STRING1 + STRING2

返回STRING1STRING2的串联

STRING.charLength()

返回STRING中的字符数

STRING.upperCase()

以大写形式返回STRING

STRING.lowerCase()

以小写形式返回STRING

STRING1.position(STRING2)

返回STRING1STRING2中第一次出现的位置(从1开始)

如果STRING2中找不到STRING1,返回0 

STRING.trim(
  leading = true,
  trailing = true,
  character = " ")

返回一个字符串,该字符串从STRING中删除前导和/或结尾字符

STRING.ltrim()

返回一个字符串,该字符串从STRING除去左空格

例如," This is a test String.".ltrim()返回“This is a test String.”。

STRING.rtrim()

返回一个字符串,该字符串从STRING中删除正确的空格

例如,"This is a test String. ".rtrim()返回“This is a test String.”。

STRING.repeat(INT)

返回一个字符串,该字符串重复基本STRING INT次。

例如,"This is a test String.".repeat(2)返回“This is a test String.This is a test String.”。

STRING1.regexpReplace(STRING2, STRING3)

返回字符串STRING1所有匹配正则表达式的子串STRING2连续被替换STRING3

例如,"foobar".regexpReplace("oo|ar", "")返回“ fb”。

STRING1.overlay(STRING2, INT1)
STRING1.overlay(STRING2, INT1, INT2)

从位置INT1返回一个字符串,该字符串将STRING1INT2默认为STRING2的长度)字符替换STRING2

例如,"xxxxxtest".overlay("xxxx", 6)返回“ xxxxxxxxx”;"xxxxxtest".overlay("xxxx", 6, 2)返回“ xxxxxxxxxst”。

STRING.substring(INT1)
STRING.substring(INT1, INT2)

返回字符串STRING的子字符串,从位置INT1开始,长度为INT2(默认为结尾)。

STRING1.replace(STRING2, STRING3)

返回一个新字符串替换其中出现的所有STRING2STRING3(非重叠)从STRING1

例如,"hello world".replace("world", "flink")返回“ hello flink”;"ababab".replace("abab", "z")返回“ zab”。

STRING1.regexpExtract(STRING2[, INTEGER1])

STRING1返回一个字符串,字符串使用指定的正则表达式STRING2和正则表达式匹配组索引INTEGER1提取

注意: regex匹配组索引从1和0开始,表示匹配整个regex。另外,正则表达式匹配组索引不应超过定义的组数。

例如,"foothebar".regexpExtract("foo(.*?)(bar)", 2)"返回“ bar”。

STRING.initCap()

返回一种新形式的STRING,其中每个单词的第一个字符转换为大写,其余字符转换为小写。

这里的单词表示字母数字字符序列。

concat(STRING1, STRING2, ...)

返回连接STRING1,STRING2,...的字符串如果任何参数为NULL,则返回NULL。

例如,concat("AA", "BB", "CC")返回“ AABBCC”。

concat_ws(STRING1, STRING2, STRING3, ...)

返回一个字符串,会连接STRING2,STRING3,......与分离STRING1

分隔符被添加到要连接的字符串之间。如果STRING1为NULL,则返回NULL。

与相比concat(),会concat_ws()自动跳过NULL参数。

例如,concat_ws("~", "AA", Null(Types.STRING), "BB", "", "CC")返回“ AA〜BB ~~ CC”。

STRING1.lpad(INT, STRING2)

返回一个新字符串,该字符串从STRING1的左侧填充STRING2,长度为INT个字符。

如果STRING1的长度小于INT,则返回缩短为INT个字符的STRING1

例如,"hi".lpad(4, "??")返回“ ?? hi”; "hi".lpad(1, "??")返回“ h”。

STRING1.rpad(INT, STRING2)

返回一个新字符串,该字符串从STRING1右侧填充STRING2,长度为INT个字符。

如果STRING1的长度小于INT,则返回缩短为INT个字符的STRING1

例如,"hi".rpad(4, "??")返回“ hi ??”; "hi".rpad(1, "??")返回“ h”。

STRING.fromBase64()

返回来自STRING的base64解码结果如果STRING为NULL,则返回null 

例如,"aGVsbG8gd29ybGQ=".fromBase64()返回“ hello world”。

STRING.toBase64()

STRING返回base64编码的结果如果STRING为NULL,则返回NULL。

例如,"hello world".toBase64()返回“ aGVsbG8gd29ybGQ =“。

时间函数

时间功能描述
STRING.toDate

返回以“ yyyy-MM-dd”形式STRING解析的SQL日期

STRING.toTime

返回以“ HH:mm:ss”的形式STRING解析的SQL时间

STRING.toTimestamp

返回从STRING解析的SQL时间戳,格式为“ yyyy-MM-dd HH:mm:ss [.SSS]”。

NUMERIC.year
NUMERIC.years

NUMERIC创建一个月间隔

NUMERIC.quarter
NUMERIC.quarters

NUMERIC个季度创建一个月间隔

例如,2.quarters传回6。

NUMERIC.month
NUMERIC.months

创建间隔NUMERIC个月。

NUMERIC.week
NUMERIC.weeks

创建NUMERIC的毫秒间隔

例如,2.weeks传回1209600000。

NUMERIC.day
NUMERIC.days

创建NUMERIC的毫秒间隔

NUMERIC.hour
NUMERIC.hours

创建NUMERIC小时的毫秒间隔

NUMERIC.minute
NUMERIC.minutes

NUMERIC分钟创建一个毫秒间隔

NUMERIC.second
NUMERIC.seconds

NUMERIC创建毫秒间隔

NUMERIC.milli
NUMERIC.millis

创建一个NUMERIC毫秒的时间间隔

currentDate()

返回UTC时区中的当前SQL日期。

currentTime()

返回UTC时区中的当前SQL时间。

currentTimestamp()

返回UTC时区中的当前SQL时间戳。

localTime()

返回本地时区的当前SQL时间。

localTimestamp()

返回本地时区的当前SQL时间戳。

TEMPORAL.extract(TIMEINTERVALUNIT)

返回从temporalTIMEINTERVALUNIT部分中提取的长值

例如,"2006-06-05".toDate.extract(TimeIntervalUnit.DAY)返回5;

"2006-06-05".toDate.extract(QUARTER)返回2。

TIMEPOINT.floor(TIMEINTERVALUNIT)

返回将TIMEPOINT向下入为时间单位TIMEINTERVALUNIT的值

例如,"12:44:31".toDate.floor(TimeIntervalUnit.MINUTE)返回12:44:00。

TIMEPOINT.ceil(TIMEINTERVALUNIT)

返回将TIMEPOINT 入为时间单位TIMEINTERVALUNIT的值

例如,"12:44:31".toTime.floor(TimeIntervalUnit.MINUTE)返回12:45:00。

temporalOverlaps(TIMEPOINT1, TEMPORAL1, TIMEPOINT2, TEMPORAL2)

如果(TIMEPOINT1TEMPORAL1)和(TIMEPOINT2TEMPORAL2定义的两个时间间隔重叠则返回TRUE 

时间值可以是时间点,也可以是时间间隔。

例如,temporalOverlaps("2:55:00".toTime, 1.hour, "3:30:00".toTime, 2.hour)返回TRUE。

dateFormat(TIMESTAMP, STRING)

注意此功能存在严重的错误,暂时不应使用。请改为实施自定义UDF或使用extract()作为解决方法。

timestampDiff(TIMEPOINTUNIT, TIMEPOINT1, TIMEPOINT2)

返回TIMEPOINT1和TIMEPOINT2之间的TIMEPOINTUNIT的(带符号)编号。 时间间隔的单位由第一个参数指定,该参数应为以下值之一:SECOND,MINUTE,HOUR,DAY,MONTH或YEAR。

另请参见时间间隔和点单位说明符表。

例如,timestampDiff(TimePointUnit.DAY,'2003-01-02 10:00:00'.toTimestamp,'2003-01-03 10:00:00'.toTimestamp)返回1。

条件函数

条件函数描述
BOOLEAN.?(VALUE1, VALUE2)

如果BOOLEAN的计算结果为TRUE,返回VALUE1;否则,返回VALUE1否则返回VALUE2

例如,(42 > 5).?("A", "B")返回“ A”。

类型转换函数功能

类型转换函数描述
ANY.cast(TYPE)

返回转换为TYPE类型的新ANY请在此处查看受支持的类型

例如,"42".cast(Types.INT)返回42;Null(Types.STRING)返回STRING类型的NULL。

Collection 函数功能

Collection 函数描述
ARRAY.cardinality()

返回ARRAY中的元素数量

ARRAY.at(INT)

返回位于元素INTARRAY索引从1开始。

ARRAY.element()

返回ARRAY的唯一元素(其基数应为1);否则false

如果ARRAY为空,则返回NULL 如果ARRAY具有多个元素,则引发异常

MAP.cardinality()

返回MAP中的条目数

MAP.at(ANY)

返回键指定的值ANYMAP

Value Construction构函数

Value Construction函数

描述
row(ANY1, ANY2, ...)

返回从对象值(ANY1,ANY2,...)的列表创建的行行是复合类型,可以通过值访问函数进行访问

array(ANY1, ANY2, ...)

返回从对象值(ANY1,ANY2,...)的列表创建的数组

map(ANY1, ANY2, ANY3, ANY4, ...)

返回从键值对列表((ANY1,ANY2),(ANY3,ANY4),...)创建的映射

NUMERIC.rows

创建NUMERIC间隔(通常在窗口创建中使用)。

Value Access函数

Value Access函数

描述
COMPOSITE.get(STRING)
COMPOSITE.get(INT)

通过名称或索引从Flink复合类型(例如,Tuple,POJO)返回字段的值。

例如,'pojo.get("myField")'tuple.get(0)

ANY.flatten()

返回Flink复合类型(例如Tuple,POJO)的平面表示形式,该类型将其每个直接子类型转换为单独的字段。

在大多数情况下,平面表示形式的字段与原始字段的命名方式相似,但带有美元分隔符(例如,mypojo $ mytuple $ f0)。

分组函数

分组函数描述
GROUP_ID()

返回一个唯一标识分组键组合的整数。

GROUPING(expression1 [, expression2]* )
GROUPING_ID(expression1 [, expression2]* )

返回给定分组表达式的位向量。

hash函数

hash函数描述
STRING.md5()

以32个十六进制数字的字符串形式返回STRING的MD5哈希值如果STRING为NULL,则返回NULL。

STRING.sha1()

以40个十六进制数字的字符串形式返回STRING的SHA-1哈希值如果STRING为NULL,则返回NULL。

STRING.sha224()

以56个十六进制数字的字符串形式返回STRING的SHA-224哈希值如果STRING为NULL,则返回NULL。

STRING.sha256()

以64个十六进制数字的字符串形式返回STRING的SHA-256哈希值如果STRING为NULL,则返回NULL。

STRING.sha384()

以96个十六进制数字的字符串返回STRING的SHA-384哈希值如果STRING为NULL,则返回NULL。

STRING.sha512()

以128个十六进制数字的字符串返回STRING的SHA-512哈希值如果STRING为NULL,则返回NULL。

STRING.sha2(INT)

返回由INT(可能为224、256、384或512)为STRING指定的SHA-2系列

(SHA-224,SHA-256,SHA-384或SHA-512)哈希值如果STRINGINT为NULL,则返回NULL。

辅助函数

辅助函数描述
ANY.as(NAME1, NAME2, ...)

指定ANY的名称(字段)。如果表达式扩展到多个字段,则可以指定其他名称。

汇总函数

聚合函数将所有行中的表达式作为输入,并返回单个聚合值作为结果。

汇总功能描述
FIELD.count

返回FIELD不为NULL 的输入行数

FIELD.avg

返回所有输入行FIELD的平均值(算术平均值)

FIELD.sum

返回所有输入行中数字字段FIELD的总和如果所有值均为NULL,则返回NULL。

FIELD.sum0

返回所有输入行中数字字段FIELD的总和如果所有值均为NULL,则返回0。

FIELD.max

返回所有输入行中数字字段FIELD的最大值

FIELD.min

返回所有输入行中数字字段FIELD的最小值

FIELD.stddevPop

返回所有输入行中数字字段FIELD的总体标准偏差

FIELD.stddevSamp

返回所有输入行中数字字段FIELD的样本标准偏差

FIELD.varPop

返回所有输入行中数字字段FIELD的总体方差(总体标准差的平方)

FIELD.varSamp

返回所有输入行中数字字段FIELD的样本方差(样本标准差的平方)

FIELD.collect

返回所有输入行FIELD的多集

时间间隔和点单位说明符

下表列出了时间间隔和时间单位的说明符。

对于Table API,请使用_空格(例如DAY_TO_HOUR)。

 

时间间隔单位时间点单位
MILLENIUM (仅SQL)  
CENTURY (仅SQL)  
YEAR YEAR
YEAR TO MONTH  
QUARTER QUARTER
MONTH MONTH
WEEK WEEK
DAY DAY
DAY TO HOUR  
DAY TO MINUTE  
DAY TO SECOND  
HOUR HOUR
HOUR TO MINUTE  
HOUR TO SECOND  
MINUTE MINUTE
MINUTE TO SECOND  
SECOND SECOND
  MILLISECOND
  MICROSECOND
DOY (仅SQL)  
DOW (仅SQL)  
  SQL_TSI_YEAR (仅SQL)
  SQL_TSI_QUARTER (仅SQL)
  SQL_TSI_MONTH (仅SQL)
  SQL_TSI_WEEK (仅SQL)
  SQL_TSI_DAY (仅SQL)
  SQL_TSI_HOUR (仅SQL)
  SQL_TSI_MINUTE (仅SQL)
  SQL_TSI_SECOND (仅SQL)

列函数

列函数用于选择或删除列.

SYNTAXDESC
withColumns(…) 选择的列
withoutColumns(…) 不选择的列

详细语法如下:

columnFunction:
    withColumns(columnExprs)
    withoutColumns(columnExprs)

columnExprs:
    columnExpr [, columnExpr]*

columnExpr:
    columnRef | columnIndex to columnIndex | columnName to columnName

columnRef:
    columnName(The field name that exists in the table) | columnIndex(a positive integer starting from 1)

下表说明了column函数的用法。(假设我们有一个包含5列的表)(a: Int, b: Long, c: String, d:String, e: String)

api用法描述
withColumns(*)| *
select(withColumns('*)) | select('*) = select('a, 'b, 'c, 'd, 'e)
所有列
withColumns(m至n)
select(withColumns(2 to 4)) = select('b, 'c, 'd)
从m到n的列
withColumns(m,n,k)
select(withColumns(1, 3, 'e)) = select('a, 'c, 'e)
m,n,k列
withColumns(m,n to k)
select(withColumns(1, 3 to 5)) = select('a, 'c, 'd, 'e)
上面两种表示的混合
withoutColumns(m to n)
select(withoutColumns(2 to 4)) = select('a, 'e)
取消选择从m到n的列
withoutColumns(m,n,k)
select(withoutColumns(1, 3, 5)) = select('b, 'd)
取消选择列m,n,k
withoutColumns(m,n to k)
select(withoutColumns(1, 3 to 5)) = select('b)
上面两种表示的混合

列函数可以在所有需要列字段的地方使用,select, groupBy, orderBy, UDFs 等.例如:

table
   .groupBy(withColumns(1 to 3))
   .select(withColumns('a to 'b), myUDAgg(myUDF(withColumns(5 to 20))))

注意:列函数仅在Table API中使用。 

欢迎关注Flink菜鸟公众号,会不定期更新Flink(开发技术)相关的推文

原文地址:https://www.cnblogs.com/Springmoon-venn/p/11900535.html