其他函数

最近更新时间:2023-12-13 21:41:32

我的收藏

FIELD

函数语法:
FIELD(<val> T, <val1> T, <val2> T, ...)
支持引擎:Presto
使用说明:返回 val1、val2…列表中 val 的索引,如果未找到则返回0。
支持所有基元类型,使用 str.equals(x)比较参数。如果 val 为 NULL,则返回值为0。
返回类型:integer
示例:
select field('world', 'say', 'hello', 'world');
3

COALESCE

函数语法:

COALESCE(<expr1> T, <expr2> T)
支持引擎:SparkSQL、Presto
使用说明:如果存在,则返回第一个非空参数。否则返回 null。
返回类型:integer
示例:
> SELECT coalesce(NULL, 1, NULL);
1

EXPLODE

函数语法:

EXPLODE(<expr> array<T>|map<K, V>)
支持引擎:SparkSQL
使用说明:将 array 类型的 expr 的元素分隔为多行,或将 map 类型的 expr 分隔为多个行和列。对数组的元素使用默认列名 col,或对映射的元素使用 key 和 value。
返回类型:row(col T) | row(key K, value V)
示例:
SELECT explode(array(10, 20));
10
20

EXPLODE_OUTER

函数语法:

EXPLODE_OUTER(<expr> array<T>|map<K, V>)
支持引擎:SparkSQL
使用说明:将 array 类型的 expr 的元素分隔为多行,或将 map 类型的 expr 分隔为多个行和列。对数组的元素使用默认列名 col,或对映射的元素使用 key 和 value。
返回类型:row(col T) | row(key K, value V)
示例:
SELECT explode_outer(array(10, 20));
10
20

GREATEST

函数语法:

GREATEST(<expr1> T, <expr2> T, ...>)
支持引擎:SparkSQL、Presto
使用说明:返回所有参数中的最大值,跳过空值。
返回类型:T
示例:
> SELECT greatest(10, 9, 2, 4, 3);
10

IF

函数语法:

IF(<expr1> boolean, <expr2> T, <expr3> U)
支持引擎:SparkSQL、Presto
使用说明:如果expr1的计算结果为true,则返回expr2;否则返回expr3。
返回类型:T|U
示例:
> SELECT if(1 < 2, 'a', 'b');
a

INLINE

函数语法:

INLINE(a array<struct<f1:T1,...,fn:Tn>>)
支持引擎:SparkSQL
使用说明:将结构数组分解为表。默认情况下使用列名col1、col2等。
返回类型:row(T1, ..., Tn)
示例:
> SELECT inline(array(struct(1, 'a'), struct(2, 'b')));
1 a
2 b

INLINE_OUTER

函数语法:

INLINE_OUTER(a array<struct<f1:T1,...,fn:Tn>>)
支持引擎:SparkSQL
使用说明:将结构数组分解为表。默认情况下使用列名col1、col2等。
返回类型:row(T1, ..., Tn)
示例:
> SELECT inline(array(struct(1, 'a'), struct(2, 'b')));
1 a
2 b

IN

函数语法:

<expr1> IN(<expr2> T, <expr3> T, ...)
支持引擎:SparkSQL、Presto
使用说明:如果expr1等于任何exprn,则返回true。
返回类型:boolean
示例:
> SELECT 1 in(1, 2, 3);
true
> SELECT 1 in(2, 3, 4);
false

ISNAN

函数语法:

ISNAN(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:如果expr为NaN,则返回true,否则返回false。
返回类型:boolean
示例:
> SELECT isnan(cast('NaN' as double));
true

IFNULL

函数语法:

IFNULL(<expr1> T, <expr2> U)
支持引擎:SparkSQL
使用说明:如果expr1为null,则返回expr2,否则返回expr1。
返回类型:T|U
示例:
> SELECT ifnull(NULL, array('2'));
["2"]

ISNULL

函数语法:

ISNULL(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:如果expr为null,则返回true,否则返回false。
返回类型:boolean
示例:
> SELECT isnull(1);
false

ISNOTNULL

函数语法:

ISNOTNULL(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:如果expr不为null,则返回true,否则返回false。
返回类型:boolean
示例:
> SELECT isnotnull(1);
true

LEAST

函数语法:

LEAST(<expr1> T, <expr2> T, ...)
支持引擎:SparkSQL、Presto
使用说明:返回所有参数中的最小值,跳过null。
返回类型:T
示例:
> SELECT least(10, 9, 2, 4, 3);
2

NANVL

函数语法:

NANVL(<expr1> T, <expr2> U)
支持引擎:SparkSQL、Presto
使用说明:nanvl(expr1,expr2),如果expr1不是NaN,则返回expr1;否则返回expr2。
返回类型:T|U
示例:
> SELECT nanvl(cast('NaN' as double), 123);
123.0

NULLIF

函数语法:

NULLIF(<expr1> T, <expr2> U)
支持引擎:SparkSQL、Presto
使用说明:如果expr1等于expr2,则返回null,否则返回expr1。
返回类型:T
示例:
> SELECT nullif(2, 2);
NULL

NVL

函数语法:

NVL(<expr1> T, <expr2> U)
支持引擎:SparkSQL、Presto
使用说明:如果expr1为null,则返回expr2,否则返回expr1。
返回类型:T|U
示例:
> SELECT nvl(NULL, array('2'));
["2"]

NVL2

函数语法:

NVL2(<expr1> T1, <expr2> T2, <expr3> T3)
支持引擎:SparkSQL、Presto
使用说明:如果expr1不为null,则返回expr2,否则返回expr3。
返回类型:T2|T3
示例:
> SELECT nvl2(NULL, 2, 1);
1

POSEXPLODE

函数语法:

POSEXPLODE(<expr> array<T>|map<K, V>)
支持引擎:SparkSQL
使用说明:将array类型的expr的元素分隔为多行,或将map类型的expr分隔为多个行和列。使用列名pos表示位置,对数组的元素使用默认列名col,或对映射的元素使用key和value。
返回类型:row(pos integer, col T)|row(row integer, key K, value V)
示例:
> SELECT posexplode(array(10,20));
0 10
1 20

POSEXPLODE_OUTER

函数语法:

POSEXPLODE_OUTER(<expr> array<T>|map<K, V>)
支持引擎:SparkSQL
使用说明:将array类型的expr的元素分隔为多行,或将map类型的expr分隔为多个行和列。使用列名pos表示位置,对数组的元素使用默认列名col,或对映射的元素使用key和value。
返回类型:row(pos integer, col T)|row(row integer, key K, value V)
示例:
> SELECT posexplode_outer(array(10,20));
0 10
1 20

STACK

函数语法:

STACK(<n> integer, <expr0> T0, ..., <expr1> T1)
支持引擎:SparkSQL
使用说明:堆栈(n,expr1,…,exprk)-将expr1、…、exprk分隔为n行。默认情况下使用列名col0、col1等。
返回类型:row(col0 T0, ..., coln Tn)
示例:
> SELECT stack(2, 1, 2, 3);
1 2
3 NULL

ASSERT_TRUE

函数语法:

ASSERT_TRUE(<expr> boolean)
支持引擎:SparkSQL、Presto
使用说明:如果expr不为true,则抛出异常。
返回类型:boolean
示例:
> SELECT assert_true(0 < 1);
NULL

RAISE_ERROR

函数语法:

RAISE_ERROR(<error> string)
支持引擎:SparkSQL、Presto
使用说明:抛出expr异常。
返回类型:string
示例:
> SELECT raise_error('custom error message');
java.lang.RuntimeException
custom error message

SPARK_PARTITION_ID

函数语法:

SPARK_PARTITION_ID()
支持引擎:SparkSQL
使用说明:返回当前分区id。
返回类型:integer
示例:
> SELECT spark_partition_id();
0

INPUT_FILE_NAME

函数语法:

INPUT_FILE_NAME()
支持引擎:SparkSQL
使用说明:返回正在读取的文件的名称,如果不可用,则返回空字符串。
返回类型:string
示例:
> SELECT input_file_name();

INPUT_FILE_BLOCK_START

函数语法:

INPUT_FILE_BLOCK_START()
支持引擎:SparkSQL
使用说明:返回正在读取的块的开始偏移量,如果不可用,则返回-1。
返回类型:integer
示例:
> SELECT input_file_block_start();
-1

INPUT_FILE_BLOCK_LENGTH

函数语法:

INPUT_FILE_BLOCK_LENGTH()
支持引擎:SparkSQL
使用说明:返回正在读取的块的长度,如果不可用,则返回-1。
返回类型:integer
示例:
> SELECT input_file_block_length();
-1

MONOTONICALLY_INCREASING_ID

函数语法:

MONOTONICALLY_INCREASING_ID()
支持引擎:SparkSQL
使用说明:返回单调递增的64位整数。生成的ID保证单调递增且唯一,但不是连续的。当前实现将分区ID放在高31位,低33位表示每个分区内的记录号。假设数据帧的分区少于10亿,每个分区的记录少于80亿条。该函数是不确定的,因为其结果取决于分区ID。
返回类型:bigint
示例:
> SELECT monotonically_increasing_id();
0

CURRENT_DATABASE

函数语法:

CURRENT_DATABASE()
支持引擎:SparkSQL
使用说明:返回当前database。
返回类型:string
示例:
> SELECT current_database();
default

CURRENT_CATALOG

函数语法:

CURRENT_CATALOG()
支持引擎:SparkSQL
使用说明:返回当前catalog
返回类型:string
示例:
> SELECT current_catalog();
spark_catalog

CURRENT_USER

函数语法:

CURRENT_USER()
支持引擎:SparkSQL、Presto
使用说明:返回当前用户
返回类型:string
示例:
> SELECT current_user();

REFLECT

函数语法:

REFLECT(<class> string, <method> string[, <arg1> T1[, <arg2> T2, ...]])
支持引擎:SparkSQL、Presto
使用说明:调用具有反射的方法。
返回类型:string
示例:
> select reflect('java.lang.Math', 'abs', -1);
1

JAVA_METHOD

函数语法:

JAVA_METHOD(<class> string, <method> string[, <arg1> T1[, <arg2> T2, ...]])
支持引擎:SparkSQL、Presto
使用说明:调用具有反射的方法。
返回类型:string
示例:
> select JAVA_METHOD('java.lang.Math', 'abs', -1);
1

VERSION

函数语法:

VERSION()
支持引擎:SparkSQL、Presto
使用说明:返回引擎版本。
返回类型:string
示例:
> select VERSION()
3.0.0 rce61711a5fa54ab34fc74d86d521ecaeea6b072a

TYPEOF

函数语法:

TYPEOF(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:返回expr的数据类型
返回类型:string
示例:
> SELECT typeof(1);
int
> SELECT typeof(array(1));
array<int>

CAST

函数语法:

CAST(<expr> AS <type>)
支持引擎:SparkSQL、Presto
使用说明:将expr转换为type类型
返回类型:<type>
示例:
> SELECT cast('10' as int);
10

BOOLEAN

函数语法:

BOOLEAN(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:将expr转换为boolean类型
返回类型:boolean
示例:
> SELECT boolean(1);
true

BIGINT

函数语法:

BIGINT(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为bigint
返回类型:bigint
示例:
> select bigint(0);
0

BINARY

函数语法:

BINARY(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为BINARY
返回类型:binary
示例:
> select binary(65);
A

DOUBLE

函数语法:

DOUBLE(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为double
返回类型:double
示例:
select double(1);
1.0

FLOAT

函数语法:

FLOAT(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为float
返回类型:float
示例:
> select float(1);
1.0

INT

函数语法:

INT(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为integer
返回类型:integer
示例:
> select int(1.0);
1

SMALLINT

函数语法:

SMALLINT(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制转换为smallint类型
返回类型:smallint
示例:
select typeof(smallint(1));
smallint

STRING

函数语法:

STRING(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为string
返回类型:string
示例:
> select typeof(string(1));
string

TINYINT

函数语法:

TINYINT(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为tinyint
返回类型:tinyint
示例:
> select typeof(tinyint(1));
tinyint

DECIMAL

函数语法:
DECIMAL(<expr> T)
支持引擎:SparkSQL、Presto
使用说明:强制类型转换为decimal
返回类型:decimal
示例:
> select typeof(decimal(1));
decimal(10, 0)

GET_IDCARD_BIRTHDAY

函数语法:
GET_IDCARD_BIRTHDAY(<string> idcardno)
支持引擎:SparkSQL
使用说明:获取身份证号中的出生日期
idcardno:必填,string 类型,必须是15号或18位身份证号码,会校验身份证合理性。不允许其他非 null 型输入。输入为 null 时返回为 null。
返回类型:date
示例(以下测试身份证号为随机样例,不代表正确身份证号)
> SELECT get_idcard_birthday('421081199001011222');
1990-01-01

GET_IDCARD_SEX

函数语法:
GET_IDCARD_SEX(<string> idcardno)
支持引擎:SparkSQL
使用说明:获取身份证号中的性别
idcardno:必填,string 类型,必须是15号或18位身份证号码,会校验身份证合理性。不允许其他非 null 型输入。输入为 null 时返回为 null。
返回类型:string
示例:(以下测试身份证号为随机样例,不代表正确身份证号)
> SELECT get_idcard_birthday('421081199001011222');


GET_IDCARD_AGE

函数语法:
GET_IDCARD_AGE(<string> idcardno)
支持引擎:SparkSQL
使用说明:获取身份证号中的年龄
idcardno:必填,string 类型,必须是15号或18位身份证号码,会校验身份证合理性。不允许其他非 null 型输入。输入为 null 时返回为 null。
返回类型:int
示例:(以下测试身份证号为随机样例,不代表正确身份证号)
> SELECT get_idcard_age('421081197001021233');
53

MAX_PT

函数语法:
MAX_PT(<const string> tableFullName)
支持引擎:SparkSQL
使用说明:获取指定分区表中的最大值
tableFullName:必填,string 类型,必须是常量值,否则会报错。tableFullName 由三段组成 catalog.db.table,其中 catalog 和 db 省略时会默认取当前 session 的配置,建议写全。
当输入的表不是分区表时,会报错。
该函数仅返回有数据的最大分区,由于是否有数据涉及到元数据中心,所以对外部表,需要注意是否有执行 ANALYZE 语句将分区的统计信息汇报到元数据中。
分区值按字典序排列取最大值。当有多级分区时,仅取第一级分区做排序。
返回类型:string
示例:
> SELECT max_pt('test.tableName');
20231024
> select * from test.tableName where dt=max_pt('test.tableName');
等同于select * from test.tableName where dt='20231014';

TRANS_ARRAY

函数语法:
TRANS_ARRAY(<int> numKeys, <string> separator, <key1>, <key2>, ..., <col1>, <col2>, ...)
支持引擎:SparkSQL
使用说明:将指定的多列 cols 拆分并转置成多行,同时支持指定部分列 keys 作为转置的 key。
numKeys:int 型,必填,表示作为转置的 keys 列的个数,必须大于等于0。
separator:string 类型,必填,当 cols 为字符串时,需要根据 separator 做拆分;当 cols 为数组时,该参数可随意填写。
keys:任意类型,个数由 numKeys 决定。
cols:string 类型或数组类型,指定的列中除去 keys 都视为 cols,即要拆分和转置的列。所有 cols 的类型必须相同,即全部为字符串,或者全部为数组,也可以特殊支持字符串和字符串数组两种类型组合的 cols。当没有 cols 时,只会输出一行。
注意1:keys 和 cols 两者的数量之和必须大于0。
注意2:当 cols 拆分后的长度不相等时,最终转置后的行数以最长的那一列为准,其他列补 NULL。
返回类型:任意类型。keys 的类型保持不变,cols 类型为字符串或数组的元素类型。
示例:
> SELECT trans_array(1, ',', key, trans1, trans2) as (key, col1, col2) from values ('1', '2,3', array('4', '5')) as tab (key, trans1, trans2);
1 2 4
1 3 5
> SELECT trans_array(0, ',', key, trans1, trans2) as (key, col1, col2) from values ('1', '2,3', array('4')) as tab (key, trans1, trans2);
1 2 4
NULL 3 NULL
> SELECT trans_array(3, ',', key, trans1, trans2) as (key, col1, col2) from values ('1', '2,3', array('4', '5')) as tab (key, trans1, trans2);
12,3 [4,5]

TRANS_COLS

函数语法:
TRANS_COLS(<int> numKeys, <key1>, <key2>, ..., <col1>, <col2>, ...)
支持引擎:SparkSQL
使用说明:将指定的多列cols转置成多行,同时支持指定部分列keys作为转置的key。
numKeys:int型,必填,表示作为转置的keys列的个数,必须大于等于0。
keys:任意类型,个数由numKeys决定。
cols:任意类型,指定的列中除去keys都视为cols,即要转置的列。所有cols的类型必须相同。当没有cols时,只会输出一行。
注意:keys和cols两者的数量之和必须大于0。
返回类型:任意类型。输出会包含一列idx,表示该行在转置的所有行中的序号,keys的类型保持不变,cols类型保持不变。
示例:
> SELECT trans_cols(1,sid,ip1,ip2) as (idx, sid, ip) from values ('s1','0.0.0.0','1.1.1.1') as tab(sid,ip1,ip2);
1 s1 0.0.0.0
2 s1 1.1.1.1

SAMPLE

函数语法:
SAMPLE(<int/long> totalParts[, <int/long> pointParts][, <col1>, <col2>, ...])
支持引擎:SparkSQL
使用说明:采样函数,对全局或按指定的列Hash值划分为totalParts份,并选择指定的第pointParts份结果返回。
totalParts:int/long型,必填,表示总共需要划分的分区数。
pointParts:int/long型,可填,表示要选择返回的第几份数据,默认值为1,必须小于等于totalParts。
cols:任意类型,可填,可以指定任意多列作为划分数据时的key,将按这些列的hash值来划分。
注意1:当cols不指定时,或者当前指定的cols全部为NULL时,为保证数据不倾斜,会使用随机值替代hash值做计算。而当cols指定时,只要有一列不为NULL,就会对hash值计算及分区结果有影响。
注意2:由于Hash值与随机值的种子时固定的,因此反复执行时只要数据顺序一致,单个partition内的采样数据也是一致的。对于存在小文件合并的场景,可能导致采样顺序变化,这个时候建议指定列做采样。
返回类型:boolean,为true表示被采样,为false表示未采样。
示例:
> select * from values (1, 'm1'), (2, 't2'), (3, 'z3') as tab(dt, uid) where sample(3, 1);
2 t2
select * from values (1, 'm1'), (2, 't2'), (3, 'z3') as tab(dt, uid) where sample(3, 1, dt);
2 t2
3 z3

TO_CHAR

函数语法:
TO_CHAR(<boolean|int|long|double|decimal> data [, <string> format])
TO_CHAR(<date|timestamp> data, string format)
支持引擎:SparkSQL
使用说明1:按指定模板格式化数字。format可以省略,即直接将数字转为字符串。否则,format的定义如下:
'0' or '9': 数字的占位符,对字符串首部,如果0占位则没有数字时用0替代,如果9占位则没有数字时用空格代替;对字符串尾部,如果没有数字统一用0代替。
'.' or 'D': 小数点的占位符,只允许出现一次。
',' or 'G': 逗号,例如百、百万的占位符,左右必须是0-9数字。
'$': 美元符,只能出现一次。
'S' or 'MI': 负号和正号的占位符,只能出现在字符串首尾最多一次。
'PR': 只允许出现在字符串结尾一次,当输入的数据是符负号时会给数字求正并加上尖括号。
使用说明2:按指定模板格式化日期或时间。format不能省略,定义如下:
yyyyMMdd HH:mm:ss.SSS中的任意字符组成的模板。
使用说明3:TO_CHAR支持隐式转换第一个参数的类型,当第一个参数为string类型时,函数会默认转为 timestamp 走模板格式化日期或时间的逻辑。
返回类型:string类型。
示例:
> select to_char(124.23);
124.23
> select to_char(124.23, '00999.9999');
<space><space>124.2300
> select to_char(4124.23, '9,999.99');
4,124.23
> select to_char(-124.23, '999.99S');
124.23-
> select to_char(-4124.23, '$9,999.99PR');
<$4,124.23>
> select to_char(date '2016-12-31 12:34:56', 'yyyyMMddHHmmss');
20161231123456