1. 概述
      Spark 支持的数值类型主要包括以下几种:整数类型(Short/Int/Long), 浮点类型(Float/Double), 十进制类型(Decimal)。在观远BI中,也兼容来自于不同类型数据库的其它类型;不过在非直连数据集的使用过程中,默认会把数值转换为整数类型(Int、Long)、浮点类型(Double)来展示和计算,小数位默认展示前6位。
      本文将介绍常用的数值转换和数学计算函数。统计类函数请参考 聚合统计函数、非聚合统计函数。
2. 函数列表
2.1. 精度处理和转换
| 用途 | 函数 | 示例 | 结果 | 
| 向上取整 | ceil(expr) / ceiling(expr)  | ceil(-0.1) | 0 | 
| 向下取整 | floor(expr)  | floor(4.12)  | 4 | 
| 使用四舍五入(HALF_UP)模式将数值舍入到指定小数位  | round(expr,d) | round(118.5, 0)  | 119 | 
| format_number(expr1, expr2) 返回string | format_number(10.123456, 4) | '10.1235' | 
| 使用半偶数舍入(HALF_EVEN)模式将数值舍入到指定小数位 | bround(expr, d)  当被舍位是5,后面还有非0值则进1;后面无数字或为0时,前一位是偶数则舍,是奇数则进1,目标是让被舍前一位变成偶数。 | bround(118.5, 0)  bround(119.5, 0) | 118 120 | 
|
| 把小数四舍五入到整数               (返回浮点数,0个小数位) | rint(expr)  | rint(10.123456) | 10 | 
| 返回数值的负值(正负值符号对调) | negative(expr) | negative(1) | -1 | 
| 判断数值的正负,正负零分别返回1、-1、0 | sign(expr) / signum(expr) | sign(10) | 1 | 
| 转换数值格式为int | int(expr) | int('10.1') | 10 | 
| 转换数值格式为bigint | bigint(expr)  | bigint('10.1') | 10 | 
| 转换数值格式为double(双精度浮点) | double(expr) | double(10) | 10.0 | 
| 转换数值格式为float(单精度浮点) | float(expr)  | float(10) | 10.0 | 
| 转换数值格式为decimal | decimal(expr)                    (默认精度为decimal(10,0)) | decimal(10.123456) | 10 | 
| 转换字段格式为目标格式 | cast(expr AS type)  | cast(10.00 as int) | 10 | 
| cast(10.123456 as decimal(10,2)) | 10.12 | 
| 把字符串类型数值转换为数值 | to_number(str, fmt)  | to_number('12,345', '99,999') | 12345 | 
| to_number('$78.12', '$99.99') | 78.12 | 
| 转换数值为指定格式字符串 | to_char(number, fmt)  to_varchar(number, fmt)  | to_char(78.12, '$99.99') | '$78.12' | 
2.2. 数学计算
| 用途 | 函数 | 示例 | 结果 | 
| 绝对值 | abs(expr)  | abs(-1) | 1 | 
| 两数相除的余数(作用同%) | mod(expr1,expr2)  | mod(2,1.8) | 0.2 | 
| 返回数值的负值(正负值符号对调) | negative(expr) | negative(1) | -1 | 
| 计算一个数的幂次方 | pow(expr1, expr2)power(expr1, expr2)
 | pow(2, 3) | 8 | 
| 计算一个非负数的算术平方根 | sqrt(expr)  | sqrt(4) | 2 | 
| 计算一个数的立方根 | cbrt(expr)  | cbrt(27) | 3 | 
| 计算0-20内数的阶乘    (expr非整数则截尾取整) | factorial(expr)  | factorial(5) | 120 | 
| 取对数 (以base为底,求expr对数,默认为自然对数底) | log(base, expr)  | log(10, 100) | 2 | 
| 以10为底的对数 | log10(expr)  | log10(100)  | 2 | 
| 以2为底的对数 | log2(expr)  | log2(16)  | 4 | 
| 计算较小数字的自然对数(作用同log(1 + expr)) | log1p(expr)  | log1p(0.01)   | 0.00995 | 
| 将弧度转化为角度 | degrees(expr)  | degrees(3.141592653589793) | 180 | 
| 把角度转换为弧度 | radians(expr) | radians(180) | 3.141593 | 
| 自然底数e(欧拉数) | e() | e() | 2.718282 | 
| 返回e的n次幂 | exp(expr)  | exp(0) | 1 | 
| 返回e的n次幂-1(作用同 exp(expr) - 1) | expm1(expr) | expm1(0) | 0 | 
| π值 | pi()  | pi()  | 3.141593 | 
2.3. 三角函数
| 用途 | 函数 | 示例 | 结果 | 
| 反余弦 | acos(expr) | acos(0) | 1.570796 | 
| 反双曲余弦 | acosh(expr) | acosh(1) | 0 | 
| 反正弦 | asin(expr) | asin(1) | 1.570796 | 
| 反双曲正弦 | asinh(expr) | asinh(1) | 0.881374 | 
| 反正切 | atan(expr)  | atan(1)  | 0.785398 | 
| 返回x、y坐标的反正切值 | atan2(exprY, exprX) | atan2(2, 2)   | 0.785398 | 
| 反双曲正切 | atanh(expr) | atanh(0.5) | 0.549306 | 
| 余弦 | cos(expr) | cos(1) | 0.540302 | 
| 双曲余弦 | cosh(expr) | cosh(1) | 1.543081 | 
| 余切 | cot(expr)  | cot(1) | 0.642093 | 
| 余割 | csc(expr) | csc(1) | 1.188395 | 
| 计算直角三角形的斜边长 | hypot(expr1, expr2)  | hypot(3, 4) | 5 | 
| 正割 | sec(expr)  | sec(0) | 1 | 
| 正弦 | sin(expr) | sin(1) | 0.841471 | 
| 双曲正弦 | sinh(expr) | sinh(1) | 1.175201 | 
| 正切 | tan(expr) | tan(1) | 1.557408 | 
| 双曲正切 | tanh(expr)  | tanh(1) | 0.761594 | 
2.4. 随机数生成
| 用途 | 函数 | 示例 | 结果 | 
| 返回均匀分布的0-1之间的随机小数 | rand() random()
 | rand()*50 | 27.225448 | 
| 返回标准正态分布的随机小数(均值为0,方差为1) | randn() | randn() | -2.425495 |