TCHouse-X 离线计算引擎深度兼容 Apache Spark 3.5.3,支持完整的 Spark SQL 内置函数库。用户可通过离线任务直接调用以下各类函数进行大规模数据处理。
1. 函数分类总览
函数类别 | 作用范围 | 典型场景 | 行数变化 |
标量函数 | 单行输入 > 单行输出 | 字段转换、格式化 | 不变 |
聚合函数 | 多行输入 > 单行输出 | 分组统计 | 减少 |
窗口函数 | 窗口范围内计算 | 排名、累计、同环比 | 不变 |
复杂类型函数 | Array/Map/Struct 处理 | 嵌套数据解析 | 可能增加(explode) |
条件/生成/转换函数 | 逻辑控制、类型转换 | 业务逻辑、数据清洗 | 视场景而定 |
2. 标量函数(Scalar Functions)
对单行中的一个或多个值进行操作,每行返回一个单一值。
2.1 字符串函数
函数 | 说明 | 示例 |
concat(s1, s2, ...) | 字符串拼接 | concat('Hello', ' ', 'World') → Hello World |
substring(str, pos, len) | 截取子串 | substring('abcdef', 2, 3) → bcd |
lower(str) | 转小写 | lower('ABC') → abc |
upper(str) | 转大写 | upper('abc') → ABC |
regexp_replace(str, pattern, replacement) | 正则替换 | regexp_replace('abc123', '\\\\d+', '') → abc |
2.2 数值/数学函数
函数 | 说明 | 示例 |
abs(x) | 绝对值 | abs(-5) → 5 |
round(x, n) | 四舍五入 | round(3.1415, 2) → 3.14 |
floor(x) | 向下取整 | floor(3.7) → 3 |
ceil(x) | 向上取整 | ceil(3.2) → 4 |
sqrt(x) | 平方根 | sqrt(16) → 4.0 |
2.3 日期和时间函数
函数 | 说明 | 示例 |
current_date() | 当前日期 | current_date() → 2026-05-07 |
date_add(date, days) | 日期加 N 天 | date_add('2026-05-07', 3) → 2026-05-10 |
date_sub(date, days) | 日期减 N 天 | date_sub('2026-05-07', 3) → 2026-05-04 |
datediff(end, start) | 计算日期差 | datediff('2026-05-07', '2026-05-01') → 6 |
from_unixtime(ts) | 时间戳转换 | from_unixtime(1700000000) → 2023-11-14 22:13:20 |
3. 聚合函数(Aggregate Functions)
作用于一组行(通常为 GROUP BY 结果),返回一个汇总值。
分类 | 函数 | 说明 |
基础统计 | count(col) | 计数 |
| sum(col) | 求和 |
| avg(col) | 平均值 |
| max(col) | 最大值 |
| min(col) | 最小值 |
高级统计 | stddev_samp(col) | 样本标准差 |
| corr(col1, col2) | 两列相关系数 |
集合聚合 | collect_list(col) | 聚合为数组(不去重) |
| collect_set(col) | 聚合为集合(去重) |
近似计算 | approx_count_distinct(col) | HyperLogLog 高效去重计数 |
4. 窗口函数(Window Functions)
在与当前行相关的行集合上执行计算,不减少结果集行数。
分类 | 函数 | 说明 |
排名函数 | row_number() | 连续唯一排名 |
| rank() | 并列排名,跳号 |
| dense_rank() | 并列排名,不跳号 |
| ntile(n) | 均分为 N 组 |
偏移函数 | lag(col, n, default) | 取前第 n 行值(默认 n=1) |
| lead(col, n, default) | 取后第 n 行值(默认 n=1) |
聚合窗口 | sum() OVER (...) | 累计求和 |
| avg() OVER (...) | 移动平均 |
示例:
SELECTuser_id,order_time,amount,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time) AS rn,LAG(amount, 1) OVER (PARTITION BY user_id ORDER BY order_time) AS prev_amountFROM orders;
5. 复杂类型处理函数(Collection / Complex Type Functions)
专门处理 Array、Map、Struct 类型。
5.1 Array 函数
函数 | 说明 | 示例 |
explode(arr) | 数组展开为多行 | explode(array(1,2,3)) → 3 行 |
array_contains(arr, value) | 判断是否包含 | array_contains(array(1,2,3), 2) → true |
element_at(arr, index) | 获取指定位置元素 | element_at(array('a','b','c'), 2) → b |
array_join(arr, sep) | 数组元素连接为字符串 | array_join(array('a','b'), ',') → a,b |
5.2 Map 函数
函数 | 说明 | 示例 |
map_keys(m) | 获取键列表 | map_keys(map('a',1,'b',2)) → [a,b] |
map_values(m) | 获取值列表 | map_values(map('a',1,'b',2)) → [1,2] |
explode(m) | Map 展开为 Key/Value 两列 | - |
5.3 JSON 处理函数
函数 | 说明 | 示例 |
get_json_object(json, path) | 按路径提取 JSON | get_json_object('{"a":1}', '$.a') → 1 |
from_json(str, schema) | JSON 字符串转结构化 | - |
to_json(struct) | 结构化转 JSON 字符串 | - |
6. 其他特殊函数
分类 | 函数 | 说明 | 示例 |
条件函数 | if(cond, v1, v2) | 条件判断 | if(age > 18, '成年', '未成年') |
| coalesce(v1, v2, ...) | 返回第一个非空值 | coalesce(NULL, NULL, 'a') → a |
| CASE WHEN ... THEN ... END | 多分支判断 | CASE WHEN x > 0 THEN '正' ELSE '负' END |
生成函数 | explode(arr) | 一行输入,多行输出 | - |
| posexplode(arr) | 带位置索引的 explode | - |
转换函数 | cast(expr AS type) | 强制类型转换 | cast('123' AS INT) → 123 |