说明:
适用版本:TCHouse-X 内核版本 2.0.0及以上版本。
数学函数(Arithmetic Functions)用于执行比基础加减乘除更复杂的数值计算。TCHouse-X 提供了丰富的函数库,涵盖三角学、对数、指数、进制转换及统计分桶等操作。
基础算术与算术扩展
函数 | 返回类型 | 说明 | 示例 |
abs(x) | 与 x 相同 | 返回 x 的绝对值。 | select abs(-10); --10 |
add(x, y) | 与 x 相同 | 返回 x + y。x 与 y 类型须一致。 | select add(5,2); --7 |
checked_add(x, y) | 与 x 相同 | 安全加法。溢出时报错。 | select checked_add(5,2); --7 |
subtract(x, y) | 与 x 相同/Decimal | 返回 x - y。x 与 y 类型须一致。 | select subtract(10, 2); -- 8 |
checked_subtract(x, y) | 与 x 相同/Decimal | 安全减法,在溢出时报错。 | - |
multiply(x, y) | 与 x 相同/Decimal | 返回 x * y。x 与 y 类型须一致。 | select multiply(2,4); -- 8 |
checked_multiply(x, y) | 与 x 相同/Decimal | 安全乘法,在溢出时报错。 | - |
divide(x, y) | Double/Decimal | 返回 x ÷ y。x 与 y 类型须一致。执行浮点除法,结果保留 6 位小数,除以零返回 NULL。 | select divide(2,4); -- 0.500000 |
checked_divide(x, y) | Double/Decimal | 安全除法,在溢出时报错。 | - |
x div y | Bigint | 整数除法,结果向下取整。溢出或除以零返回 NULL。 | select 1 div 2; -- 0select 3 div 2; -- 1select -3 div 2; -- -2 |
pmod(n, m) | 与 n 相同 | 返回 n ÷ m 的正余数。 | select pmod(-10, 3); -- 2select pmod(10, 3); -- 1 |
remainder(n, m) | 与 n 相同 | 返回 n % m 的余数(同 Spark %)。 | select remainder(-10, 3); -- -1select remainder(10, 3); -- 1 |
unaryminus(x) | 与 x 相同 | 返回 -x。 | select unaryminus(1); -- -1select unaryminus(-1); -- 1select unaryminus(0); -- 0 |
数值修约与比较函数
函数 | 返回类型 | 说明 | 示例 |
ceil(x) | 与 x 相同 | 向上取整。支持 Bigint, Double, Decimal。 | select ceil(1.23); --2 |
floor(x) | 与 x 相同 | 向下取整。支持 Bigint, Double, Decimal。 | select floor(1.23); --1 |
round(x, d) | 与 x 相同 | 四舍五入到 d 位(使用 HALF_UP 模式)。 | select round(1.2345,2); --1.23 |
rint(x) | Double | 返回最接近 x 的整数(双精度)。 | select rint(12.34); --12select rint(12.54); --13 |
greatest(x, ...) | 与 x 相同 | 返回参数列表中的最大值,忽略 NULL。 | select greatest(1, 5, 2); --5 |
least(x, ...) | 与 x 相同 | 返回参数列表中的最小值,忽略 NULL。 | select least(1, 5, 2); --1 |
sign(x) / signum | Double | 返回符号:正数 1,负数 -1,零 0。 | select sign(100);-- 1select sign(-100);-- -1select sign(0);-- 0 |
指数、对数与幂运算
函数 | 返回类型 | 说明 | 示例 |
e() | Double | 返回欧拉常数 e。 | select e(); --2.7182818284590451 |
exp(x) | Double | 返回欧拉常数 e 的 x次幂。 | select exp(1); --2.7182818284590451select exp(2); --7.38905609893065 |
expm1(x) | Double | 返回 e^x - 1。在 x 接近 0 时比 exp(x)-1 更精确。 | select expm1(1); --1.7182818284590451 |
ln(x) / log(x) | Double | 返回 x 的自然对数(以 e 为底)。 | select log(e()); --1select ln(e()); --1 |
log(base, x) | Double | 返回以 base 为底的 x 的对数。 | select log(2, 8); --3 |
log10(x) | Double | 返回以 10 为底的对数。 | select log10(100); --2 |
log2(x) | Double | 返回以 2 为底的对数。 | select log2(8); --3 |
log1p(x) | Double | 返回 ln(x + 1)。 | select log1p(0); --0 |
pow(x, p) | Double | 返回 x 的 p 次幂。 | select pow(2, 3); --8 |
sqrt(x) | Double | 返回 x 的平方根。 | select sqrt(9); --3 |
cbrt(x) | Double | 返回 x 的立方根。 | select cbrt(8);--2 |
factorial(x) | Bigint | 返回 x 的阶乘(x 须在 0-20 之间)。 | select factorial(5); --120 |
三角函数
函数 | 返回类型 | 说明 | 示例 |
sin(x) | Double | 返回 x(弧度)的正弦值。 | SELECT sin(PI()/2); -- 结果:1 (90°的正弦) |
cos(x) | Double | 返回 x(弧度)的余弦值。 | SELECT cos(PI()); -- 结果:-1 (180°的余弦) |
tan(x) | Double | 返回 x(弧度)的正切值。 | SELECT tan(PI() / 4); -- 预期 1.0,实际返回 0.99999999999999989(浮点精度误差,非 bug) |
asin(x) | Double | 返回 x(弧度)的反正弦值。 | SELECT asin(1.0); --1.57079... (π/2) |
acos(x) | Double | 返回 x(弧度)的反余弦值。 | SELECT acos(-1.0); --3.14159... (π) |
atan(x) | Double | 返回 x(弧度)的反正切值。 | SELECT atan(1.0); --0.78539... (π/4) |
sinh(x) | Double | 返回 x(弧度)的双曲正弦 。 | SELECT sinh(1.0); --1.1752... |
cosh(x) | Double | 返回 x(弧度)的双曲余弦。 | SELECT cosh(0); --1 |
tanh(x) | Double | 返回 x(弧度)的双曲正切值。 | SELECT tanh(0.5); --0.4621... |
asinh(x) | Double | 返回 x(弧度)的反双曲正弦值。 | SELECT asinh(1.0); --0.8813... |
acosh(x) | Double | 返回 x(弧度)的反双曲余弦值。 | SELECT acosh(1.0); --0 |
atanh(x) | Double | 返回 x(弧度)的反双曲正切值。 | SELECT atanh(0.5); --0.5493... |
cot(x) | Double | 返回 x(弧度)的余切值。 | SELECT cot(PI() / 4); -- 预期结果 1.0,实际返回 1.0000000000000002(浮点精度误差,非 bug) |
csc(x) | Double | 返回 x(弧度)的余割值。 | SELECT csc(PI()/2);--1 (余割,1/sin) |
sec(x) | Double | 返回 x(弧度)的正割值。 | SELECT sec(0); -- 结果:1.0 (正割,1/cos) |
atan2(y, x) | Double | 返回 y/x 的反正切值。兼容 Spark 极端情况。 | SELECT atan2(1, 1); --0.78539... (坐标 (1,1) 的极角) |
degrees(x) | Double | 将弧度转换为角度。 | SELECT degrees(PI()); -- 180 |
radians(x) | Double | 将角度转换为弧度。 | SELECT radians(180); --3.14159...(π) |
hypot(a, b) | Double | 返回 sqrt(a^2 + b^2) 的值。 | SELECT hypot(3, 4); --5 |
进制转换与位操作
函数 | 返回类型 | 说明 | 示例 |
bin(x) | Varchar | 返回 Long 类型 x 的二进制字符串。 | SELECT bin(10); --'1010' |
hex(x) | Varchar | 返回 x 的十六进制字符串。支持数字、字符串和二进制。 | SELECT hex(255); --'FF' |
unhex(x) | Varbinary | 将十六进制字符串转回二进制。匹配 Spark 3.5.3 行为。 | SELECT hex('ABC'); --'414243' |
conv(n, f, t) | Varchar | 将数字从 f 进制转换为 t 进制。 | SELECT conv('1010', 2, 10); --'10'SELECT conv('FF', 16, 2); --'11111111' |
unscaled_value(x) | Bigint | 返回短小数( Short Decimal)的原始 Bigint 值。 | SELECT unscaled_value(CAST(12.34 AS DECIMAL(10, 2))); --1234 |
其他特殊函数
函数 | 返回类型 | 说明 | 示例 |
isnan(x) | Boolean | 检查 x 是否为 NaN。支持 Float/Double。 | SELECT isnan(cast('nan' as double)); -- 1 |
rand([seed]) /random([seed]) | Double | 返回 [0, 1) 范围内的随机数。指定 seed 可获得确定性结果。 | SELECT rand(); -- 结果随机SELECT rand(123); -- 结果固定 |
not(x) | Boolean | not true 返回 false | SELECT not(1 = 1); --0 |
width_bucket(x, b1, b2, n) | Bigint | 将 x 分配到从 b1 到 b2 划分为 n 个等宽桶中的桶编号。 |
|