函数说明

本文介绍常见内建函数使用方法。

类型转换函数

函数

说明

CAST

将值转换为指定数据类型。

TRY_CAST

尝试转换类型,失败返回NULL

COALESCE(处理NULL值)

返回参数列表中第一个非 NULL 的值。

日期时间函数

函数

说明

CURRENT_DATE

获取当前日期。

DATE_FORMAT

将日期/时间值按指定格式转换为字符串。

DATE_ADD

在指定日期基础上增加指定天数。

DATEDIFF

计算两个日期之间的天数差。

UNIX_TIMESTAMP

将日期/时间转换为Unix时间戳。

字符串函数

函数

说明

CONCAT

连接一个或多个字符串,生成新字符串。

SUBSTRING/SUBSTR

从源字符串截取指定位置的子字符串。

编解码函数

函数

说明

HEX 函数

将输入值转换为十六进制字符串来表示。

UNHEX 函数

将十六进制字符串转换为二进制数据。

BASE64 函数

将二进制数据编码为Base64格式的字符串。

UNBASE64 函数

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)
-- 输出: 1577836800000

CONCAT

连接一个或多个字符串,生成新字符串。

语法

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)