Serverless Spark 内置了多种函数,能够满足大部分数据处理需求。本文将为您介绍 Serverless Spark 内置提供的函数及其使用说明。
支持的版本
仅Serverless Spark以下引擎版本支持本文操作:
esr-4.x:esr-4.4.0及之后版本。
esr-3.x:esr-3.4.0及之后版本。
esr-2.x:esr-2.8.0及之后版本。
内置函数清单
Serverless Spark 兼容开源内置函数的使用,开源具体函数说明请参见 Spark SQL Functions。此外,Serverless Spark 还支持多个特有内置函数,以下是特有支持的内置函数及其相关说明。
函数 | 说明 |
获取Parquet文件Schema结构。 | |
获取Parquet文件元数据。 | |
将 | |
返回分区表的一级分区中包含数据的分区的最大值。 | |
提取键值对数据。 |
内置函数说明
PARQUET_SCHEMA
获取Parquet文件Schema结构。
语法
PARQUET_SCHEMA('<parquet_file_path>')
使用示例
SELECT PARQUET_SCHEMA('oss://bucket/path/part1.parquet')
返回结果:
message spark_schema { required int32 id; }
PARQUET_METADATA
获取Parquet文件元数据,包括文件Footer信息、行组(Row Group)详细信息、列压缩与编码方式。
语法
PARQUET_METADATA('<parquet_file_path>')
使用示例
SELECT PARQUET_METADATA('oss://bucket/path/part1.parquet')
返回结果:
=== Row Group ID: 0 === row_group_id: 0 row_group_num_rows: 1 row_group_num_columns: 1 row_group_bytes: 27 --- Column Chunk ID: 0 in Row Group 0 --- column_id: 0 path_in_schema: id num_values: 1 type: INT32 stats: min: 1, max: 1, num_nulls: 0 compression: SNAPPY encodings: PLAIN,BIT_PACKED compressedSize: 29 uncompressedSize: 27
URL_DECODE
将application/x-www-form-urlencoded MIME
格式的字符串解码为常规字符串。支持开启安全解码URL内容模式。当入参不合法时,使用set spark.sql.emr.tryUrlDecode=true
,则不会抛出异常而是返回NULL
。
语法
URL_DECODE(string);
使用示例
SELECT URL_DECODE('http%3A%2F%2spark.apache.org');
返回结果:
Error: CANNOT_DECODE_URL
。配置
set spark.sql.emr.tryUrlDecode=true
。set spark.sql.emr.tryUrlDecode=true; SELECT URL_DECODE('http%3A%2F%2spark.apache.org');
返回结果:
NULL
。
MAX_PT
返回分区表的一级分区中包含数据的分区的最大值,按字母顺序排序,并读取该分区下对应的数据。
语法
MAX_PT('tableName');
tableName支持通过catalog.database.tableName或database.tableName的格式显式指定表所属的catalog和database。当未显式声明catalog和database时,系统将使用默认的catalog和database。
使用示例
例如tbl是分区表,该表对应的分区为2025-05-21和2025-05-20,且都有数据,下述语句会返回2025-05-21分区下的数据。
SELECT * FROM tbl WHERE pt= MAX_PT('tbl');
返回结果:
KEYVALUE
提取键值对数据。
语法
KEYVALUE(str [, split1, split2,] key)
根据指定的两个分隔符对原字符串进行拆分。如果在表达式中未指定这两个分隔符,则默认将split1设定为“;”,将split2设定为“:”。当某个经过split1拆分的字符串中包含多个split2时,返回结果将未定义。
使用示例
SELECT KEYVALUE('0:1\;1:2', 1);
返回结果:2。