本文介绍常见内建函数使用方法。
类型转换函数
函数 | 说明 |
将值转换为指定数据类型。 | |
尝试转换类型,失败返回 | |
返回参数列表中第一个非 |
日期时间函数
函数 | 说明 |
获取当前日期。 | |
将日期/时间值按指定格式转换为字符串。 | |
在指定日期基础上增加指定天数。 | |
计算两个日期之间的天数差。 | |
将日期/时间转换为Unix时间戳。 |
字符串函数
函数 | 说明 |
连接一个或多个字符串,生成新字符串。 | |
从源字符串截取指定位置的子字符串。 |
编解码函数
函数 | 说明 |
将输入值转换为十六进制字符串来表示。 | |
将十六进制字符串转换为二进制数据。 | |
将二进制数据编码为Base64格式的字符串。 | |
将Base64字符串解码为二进制数据。 |
详细函数说明
CAST
将输入值显式转换为指定数据类型,支持跨数据类型转换,转换失败则返回NULL。
语法
CAST(expression AS target_data_type);参数说明
参数 | 是否必填 | 说明 |
expression | 是 | 需要转换的源值,可以为任意类型。 |
target_data_type | 是 | 指定目标数据的类型。 |
示例
-- 示例1: 字符串转整数
SELECT CAST('123' AS INT);
-- 输入: '123' (STRING)
-- 输出: 123 (INT)
-- 示例2: 浮点数转字符串
SELECT CAST(3.14 AS STRING);
-- 输入: 3.14 (DOUBLE)
-- 输出: '3.14' (STRING)
TRY_CAST
尝试转换类型,转换成功会返回目标类型,转换失败则返回NULL。
语法
TRY_CAST(expression AS target_data_type);参数说明
参数 | 是否必填 | 说明 |
expression | 是 | 需要转换的源值,可以为任意类型。 |
target_data_type | 是 | 指定目标数据的类型。 |
示例
-- 示例1: 无效转换返回NULL
SELECT TRY_CAST('abc' AS INT);
-- 输入: 'abc' (STRING)
-- 输出: NULL (INT)
-- 示例2: 有效转换
SELECT TRY_CAST('2023-01-01' AS DATE);
-- 输入: '2023-01-01' (STRING)
-- 输出: 2023-01-01 (DATE)COALESCE(处理NULL值)
返回参数列表中第一个非NULL的值。
如果所有参数都是
NULL,则返回NULL。在 Spark SQL 中,这个函数常用来进行缺失值填充或多列优先级选择。
关键特性
短路求值:从左到右依次检查,遇到第一个非
NULL值就停止。类型一致性:所有参数必须是相同或可隐式转换的类型,否则会报错。
语法
COALESCE(expr1, expr2, ..., exprN)参数说明
参数 | 是否必填 | 说明 |
expr1, expr2, ..., exprN | 是 | 需要检查的值。 至少两个参数,多个参数之间用英文逗号(,)分隔。 支持任意数据类型。 |
示例
SELECT COALESCE(NULL, NULL, 'Hello', 'World') AS result;
-- 输出:'Hello'CURRENT_DATE
获取当前日期。
语法
CURRENT_DATE();示例
-- 示例1: 获取当前日期
SELECT CURRENT_DATE();
-- 输入: 无
-- 输出: 2023-08-15 (DATE)DATE_FORMAT
将日期/时间值按指定格式转换为字符串。
语法
DATE_FORMAT(date_value, format_pattern);参数说明
参数 | 是否必填 | 说明 |
date_value | 是 | 待格式化的日期/时间值。 支持的数据类型:date、timestamp。 |
format_pattern | 是 | 指定目标数据的类型。 仅支持string类型。 |
示例
-- 示例1: 格式化为年-月-日
SELECT DATE_FORMAT('2023-08-15', 'yyyy-MM-dd');
-- 输入: '2023-08-15' (STRING), 'yyyy-MM-dd' (STRING)
-- 输出: '2023-08-15' (STRING)
-- 示例2: 格式化为月/日/年
SELECT DATE_FORMAT('2023-08-15', 'MM/dd/yyyy');
-- 输入: '2023-08-15' (STRING), 'MM/dd/yyyy' (STRING)
-- 输出: '08/15/2023' (STRING)DATE_ADD
在指定日期基础上增加指定天数。
语法
DATE_ADD(start_date, days);参数说明
参数 | 是否必填 | 说明 |
start_date | 是 | 起始日期。 支持的数据类型:date、timestamp。 |
days | 是 | 要增加的天数。 仅支持int类型。 |
示例
-- 示例1: 加10天
SELECT DATE_ADD('2023-08-15', 10);
-- 输入: '2023-08-15' (STRING), 10 (INT)
-- 输出: 2023-08-25 (DATE)
-- 示例2: 计算到期日
SELECT DATE_ADD(CURRENT_DATE(), 30);
-- 输入: '2023-08-15', 30 (INT)
-- 输出: 2023-09-14 (DATE)DATEDIFF
计算两个日期之间的天数差。
语法
DATEDIFF(end_date, start_date);参数说明
参数 | 是否必填 | 说明 |
end_date | 是 | 结束日期。 支持的数据类型:date、timestamp。 |
start_date | 是 | 开始日期。 支持的数据类型:date、timestamp。 |
示例
-- 示例1: 计算日期差
SELECT DATEDIFF('2023-08-20', '2023-08-15');
-- 输入: '2023-08-20' (STRING), '2023-08-15' (STRING)
-- 输出: 5 (INT)
-- 示例2: 计算年龄
SELECT DATEDIFF(CURRENT_DATE(), '1990-05-10')/365;
-- 输入: DATE, '1990-05-10' (STRING)
-- 输出: 33 (INT)UNIX_TIMESTAMP
将日期/时间转换为Unix秒级别时间戳。
语法
UNIX_TIMESTAMP(date_expr);参数说明
参数 | 是否必填 | 说明 |
date_expr | 否 | 可选参数,无参数时返回当前时间戳。 支持的数据类型:date、timestamp、string。 |
示例
-- 示例1: 当前时间戳
SELECT UNIX_TIMESTAMP();
-- 输入: 无
-- 输出: 1692072000 (LONG)
-- 示例2: 字符串转时间戳
SELECT UNIX_TIMESTAMP('2023-08-15 12:00:00');
-- 输入: '2023-08-15 12:00:00' (STRING)
-- 输出: 1692072000 (LONG)UNIX_MILLIS
获取 Unix 毫秒时间戳。
语法
UNIX_MILLIS(date_expr);参数说明
参数 | 是否必填 | 说明 |
date_expr | 是 | 支持的数据类型:date、timestamp。 说明 若数据为string类型,则需先转换成timestamp类型。 |
示例
-- 示例1: 当前时间戳
SELECT UNIX_MILLIS(CURRENT_TIMESTAMP());
-- 输出: 1712345678901
-- 示例2: 字符串转时间戳
SELECT unix_millis(CAST('2020-01-01 00:00:00' AS timestamp));
-- 输入: '2020-01-01 00:00:00' (STRING)
-- 输出: 1577836800000CONCAT
连接一个或多个字符串,生成新字符串。
语法
CONCAT(str1, str2, ..., strN);参数说明
参数 | 是否必填 | 说明 |
str1, str2, ..., strN | 是 | 需要处理的字符串。 至少两个参数,多个参数之间用英文逗号(,)分隔。 仅支持string类型。 |
示例
-- 示例1: 连接两个字符串
SELECT CONCAT('Hello', ' World');
-- 输入: 'Hello' (STRING), ' World' (STRING)
-- 输出: 'Hello World' (STRING)
-- 示例2: 连接多列
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users;
-- 输入: first_name (STRING), ' ' (STRING), last_name (STRING)
-- 输出: 'John Doe' (STRING)SUBSTRING/SUBSTR
从源字符串截取指定位置的子字符串。
语法
-- 方法1:
SUBSTRING(str, pos[, len]);
-- 方法2:
SUBSTR(str, pos[, len]);参数说明
参数 | 是否必填 | 说明 |
str | 是 | 需要提取子字符串的源字符串。 仅支持string类型。 |
pos | 是 | 起始位置,从1开始计数。 仅支持int类型。 |
len | 否 | 需要提取的子字符串长度。 仅支持int类型。 |
示例
SELECT SUBSTRING('Spark SQL', 7);
-- 输入: 'Spark SQL' (STRING), 7 (INT)
-- 输出: 'SQL' (STRING)
SELECT SUBSTR('Spark SQL', 1, 5);
-- 输入: 'Spark SQL' (STRING), 1 (INT), 5 (INT)
-- 输出: 'Spark' (STRING)HEX 函数
将输入值转换为十六进制字符串来表示。
语法
HEX(input);参数说明
参数 | 是否必填 | 说明 |
input | 是 | 需要转换的源值。 支持的数据类型:string、binary、所有数值类型。 |
示例
-- 示例1:字符串转十六进制
SELECT HEX('Spark');
-- 输入: 'Spark' (STRING)
-- 输出: '537061726B' (STRING)
-- 说明: 'S'=0x53, 'p'=0x70, 'a'=0x61, 'r'=0x72, 'k'=0x6B
-- 示例2:数值转十六进制
SELECT HEX(12345);
-- 输入: 12345 (INT)
-- 输出: '3039' (STRING)
-- 说明: 12345的十六进制表示为0x3039
-- 示例3:二进制数据转十六进制
SELECT HEX(BINARY('Spark'));
-- 输入: [83 112 97 114 107] (BINARY)
-- 输出: '537061726B' (STRING)UNHEX 函数
将十六进制字符串转换为二进制数据。
语法
UNHEX(hex_string);参数说明
参数 | 是否必填 | 说明 |
hex_string | 是 | 待转换的十六进制字符串。 仅支持string类型。 |
示例
-- 示例1:十六进制转二进制
SELECT UNHEX('537061726B');
-- 输入: '537061726B' (STRING)
-- 输出: [83 112 97 114 107] (BINARY)
-- 等价于: BINARY('Spark')
-- 示例2:转换后转字符串
SELECT CAST(UNHEX('48656C6C6F') AS STRING);
-- 输入: '48656C6C6F' (STRING)
-- 输出: 'Hello' (STRING)BASE64 函数
将二进制数据编码为Base64格式的字符串。
语法
BASE64(binary_data);参数说明
参数 | 是否必填 | 说明 |
binary_data | 是 | 待编码的二进制数据。 仅支持binary类型。 |
示例
-- 示例1:二进制数据编码
SELECT BASE64(BINARY('Spark'));
-- 输入: [83 112 97 114 107] (BINARY)
-- 输出: 'U3Bhcms=' (STRING)
-- 示例2:字符串先转二进制再编码
SELECT BASE64(CAST('Hello' AS BINARY));
-- 输入: 'Hello' (STRING)
-- 中间转换: [72 101 108 108 111] (BINARY)
-- 输出: 'SGVsbG8=' (STRING)UNBASE64 函数
将Base64字符串解码为二进制数据。
语法
UNBASE64(str);参数说明
参数 | 是否必填 | 说明 |
str | 是 | 待解码的Base64字符串。 仅支持string类型。 |
示例
-- 示例1:Base64解码
SELECT UNBASE64('U3Bhcms=');
-- 输入: 'U3Bhcms=' (STRING)
-- 输出: [83 112 97 114 107] (BINARY)
-- 等价于: BINARY('Spark')
-- 示例2:解码后转字符串
SELECT CAST(UNBASE64('SGVsbG8=') AS STRING);
-- 输入: 'SGVsbG8=' (STRING)
-- 输出: 'Hello' (STRING)