数据湖计算 DLC 其他函数

这篇说说了腾讯云支持的多种SQL函数及其使用方法,包括FIELD、COALESCE、EXPLODE等。每种函数都详细说明了其语法、支持引擎、使用说明、返回类型及示例。这些函数涵盖了数据处理、类型转换、条件判断等多个方面,适用于SparkSQL和Presto引擎。FIELD函数: 返回指定值在列表中的索引,未找到则返回0。COALESCE函数: 返回第一个非空参数,否则返回null。EXPLODE函数: 将数组或映射类。

相关产品
数据湖计算 DLC 产品页,含版本规格、价格与购买入口。

一、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

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

21、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

22、ASSERT_TRUE

·函数语法:

ASSERT_TRUE(<expr> boolean)

·支持引擎:SparkSQL、Presto

·使用说明:如果expr不为true,则抛出异常。

·返回类型:boolean

·示例:

> SELECT assert_true(0 < 1); NULL

23、RAISE_ERROR

·函数语法:

RAISE_ERROR(<error> string)

·支持引擎:SparkSQL、Presto

·使用说明:抛出expr异常。

·返回类型:string

·示例:

> SELECT raise_error('custom error message'); java.lang.RuntimeException custom error message

24、SPARK_PARTITION_ID

·函数语法:

SPARK_PARTITION_ID()

·支持引擎:SparkSQL

·使用说明:返回当前分区id。

·返回类型:integer

·示例:

> SELECT spark_partition_id(); 0

25、INPUT_FILE_NAME

·函数语法:

INPUT_FILE_NAME()

·支持引擎:SparkSQL

·使用说明:返回正在读取的文件的名称,如果不可用,则返回空字符串。

·返回类型:string

·示例:

> SELECT input_file_name();

26、INPUT_FILE_BLOCK_START

·函数语法:

INPUT_FILE_BLOCK_START()

·支持引擎:SparkSQL

·使用说明:返回正在读取的块的开始偏移量,如果不可用,则返回-1。

·返回类型:integer

·示例:

> SELECT input_file_block_start(); -1

27、INPUT_FILE_BLOCK_LENGTH

·函数语法:

INPUT_FILE_BLOCK_LENGTH()

·支持引擎:SparkSQL

·使用说明:返回正在读取的块的长度,如果不可用,则返回-1。

·返回类型:integer

·示例:

> SELECT input_file_block_length(); -1

28、MONOTONICALLY_INCREASING_ID

·函数语法:

MONOTONICALLY_INCREASING_ID()

·支持引擎:SparkSQL

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

·返回类型:bigint

·示例:

> SELECT monotonically_increasing_id(); 0

29、CURRENT_DATABASE

·函数语法:

CURRENT_DATABASE()

·支持引擎:SparkSQL

·使用说明:返回当前database。

·返回类型:string

·示例:

> SELECT current_database(); default

30、CURRENT_CATALOG

·函数语法:

CURRENT_CATALOG()

·支持引擎:SparkSQL

·使用说明:返回当前catalog

·返回类型:string

·示例:

> SELECT current_catalog(); spark_catalog

31、CURRENT_USER

·函数语法:

CURRENT_USER()

·支持引擎:SparkSQL、Presto

·使用说明:返回当前用户

·返回类型:string

·示例:

> SELECT current_user();

32、REFLECT

·函数语法:

REFLECT(<class> string, <method> string[, <arg1> T1[, <arg2> T2, …]])

·支持引擎:SparkSQL、Presto

·使用说明:调用具有反射的方法。

·返回类型:string

·示例:

> select reflect('java.lang.Math', 'abs', -1); 1

33、JAVA_METHOD

·函数语法:

JAVA_METHOD(<class> string, <method> string[, <arg1> T1[, <arg2> T2, …]])

·支持引擎:SparkSQL、Presto

·使用说明:调用具有反射的方法。

·返回类型:string

·示例:

> select JAVA_METHOD('java.lang.Math', 'abs', -1); 1

34、VERSION

·函数语法:

VERSION()

·支持引擎:SparkSQL、Presto

·使用说明:返回引擎版本。

·返回类型:string

·示例:

> select VERSION() 3.0.0 rce61711a5fa54ab34fc74d86d521ecaeea6b072a

35、TYPEOF

·函数语法:

TYPEOF(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:返回expr的数据类型

·返回类型:string

·示例:

> SELECT typeof(1); int> SELECT typeof(array(1)); array<int>

36、CAST

·函数语法:

CAST(<expr> AS <type>)

·支持引擎:SparkSQL、Presto

·使用说明:将expr转换为type类型

·返回类型:<type>

·示例:

> SELECT cast('10' as int); 10

37、BOOLEAN

·函数语法:

BOOLEAN(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:将expr转换为boolean类型

·返回类型:boolean

·示例:

> SELECT boolean(1); true

38、BIGINT

·函数语法:

BIGINT(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为bigint

·返回类型:bigint

·示例:

> select bigint(0); 0

39、BINARY

·函数语法:

BINARY(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为BINARY

·返回类型:binary

·示例:

> select binary(65); A

40、DOUBLE

·函数语法:

DOUBLE(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为double

·返回类型:double

·示例:

select double(1); 1.0

41、FLOAT

·函数语法:

FLOAT(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为float

·返回类型:float

·示例:

> select float(1); 1.0

42、INT

·函数语法:

INT(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为integer

·返回类型:integer

·示例:

> select int(1.0); 1

43、SMALLINT

·函数语法:

SMALLINT(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制转换为smallint类型

·返回类型:smallint

·示例:

select typeof(smallint(1)); smallint

44、STRING

·函数语法:

STRING(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为string

·返回类型:string

·示例:

> select typeof(string(1)); string

45、TINYINT

·函数语法:

TINYINT(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为tinyint

·返回类型:tinyint

·示例:

> select typeof(tinyint(1)); tinyint

46、DECIMAL

·函数语法:

DECIMAL(<expr> T)

·支持引擎:SparkSQL、Presto

·使用说明:强制类型转换为decimal

·返回类型:decimal

·示例:

> select typeof(decimal(1)); decimal(10, 0)

47、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

48、GET_IDCARD_SEX

·函数语法:

GET_IDCARD_SEX(<string> idcardno)

·支持引擎:SparkSQL

·使用说明:获取身份证号中的性别

·idcardno:必填,string 类型,必须是15号或18位身份证号码,会校验身份证合理性。不允许其他非 null 型输入。输入为 null 时返回为 null。

·返回类型:string

·示例:(以下测试身份证号为随机样例,不代表正确身份证号)

> SELECT get_idcard_birthday('421081199001011222');

49、GET_IDCARD_AGE

·函数语法:

GET_IDCARD_AGE(<string> idcardno)

·支持引擎:SparkSQL

·使用说明:获取身份证号中的年龄

·idcardno:必填,string 类型,必须是15号或18位身份证号码,会校验身份证合理性。不允许其他非 null 型输入。输入为 null 时返回为 null。

·返回类型:int

·示例:(以下测试身份证号为随机样例,不代表正确身份证号)

> SELECT get_idcard_age('421081197001021233');53

50、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';

51、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 41 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 4NULL 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]

52、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.02 s1 1.1.1.1

53、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 t23 z3

54、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中的任意字符组成的模板。

·详细参考: https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html

·使用说明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

赞 (0)
上一篇 4天前
下一篇 4天前