Hive函數大全(含例子)之數學函數(Mathematical Functions)

爲了方便測試,創建了dual表,該表只有一個字段以及只有一行數據,建表語句如下:

CREATE TABLE dual (
  x INT
)

函數名稱:round(DOUBLE a),返回類型:DOUBLE

返回數字 a 四捨五入後的值

select round(1.5) from dual;  -- 結果爲 2
select round(1.1) from dual;  -- 結果爲 1

函數名稱:round(DOUBLE a, INT d),返回類型:DOUBLE

返回數字 a 四捨五入到小數點後 d 位的值

select round(1.15, 1) from dual;  -- 結果爲 1.2
select round(1.12, 1) from dual;  -- 結果爲 1.1
select round(1.12, 3) from dual;  -- 結果爲 1.12
select round(1.12, 0) from dual;  -- 結果爲 1.0
select round(1.12, -1) from dual;  -- 結果爲 0.0

函數名稱:bround(DOUBLE a),返回類型:DOUBLE

返回數字 a 高斯舍入後的值

高斯舍入也稱銀行家舍入,簡單的說就是四捨六入五考慮,五後非空就進一,五後爲空看奇偶,五前爲偶應捨去,五前爲奇要進一

-- 四舍
select bround(1.4) from dual;  -- 結果爲 1.0
-- 六入
select bround(1.6) from dual;  -- 結果爲 2.0
-- 五後非空就進一
select bround(1.51) from dual;  -- 結果爲 2.0
-- 五前爲偶應捨去
select bround(2.5) from dual;  -- 結果爲 2.0
-- 五前爲奇要進一
select bround(3.5) from dual;  -- 結果爲 4.0

函數名稱:bround(DOUBLE a, INT d),返回類型:DOUBLE

返回數字 a 高斯舍入到小數點後 d 位的值

-- 四舍
select bround(1.14, 1) from dual;  -- 結果爲 1.1
-- 六入
select bround(1.16, 1) from dual;  -- 結果爲 1.2
-- 五後非空就進一
select bround(1.151, 1) from dual;  -- 結果爲 1.2
-- 五前爲偶應捨去
select bround(1.25, 1) from dual;  -- 結果爲 1.2
-- 五前爲奇要進一
select bround(1.35, 1) from dual;  -- 結果爲 1.4

函數名稱:floor(DOUBLE a),返回類型:BIGINT

對數字 a 向下取整

select floor(1.1) from dual;  -- 結果爲 1
select floor(1.6) from dual;  -- 結果爲 1
select floor(-1.1) from dual;  -- 結果爲 -2
select floor(-1.6) from dual;  -- 結果爲 -2

函數名稱:ceil(DOUBLE a), ceiling(DOUBLE a),返回類型:BIGINT

對數字 a 向上取整,ceil同ceiling

select ceil(1.1) from dual;  -- 結果爲 2
select ceil(1.6) from dual;  -- 結果爲 2
select floor(-1.1) from dual;  -- 結果爲 -1
select floor(-1.6) from dual;  -- 結果爲 -1

函數名稱:rand(), rand(INT seed),返回類型:DOUBLE

如果 seed 不指定,則返回0到1之間的隨機數,如:

select rand() from dual;  -- 結果爲 0.9811062452094043

如果 seed 指定了,隨機數是確定的,如:

select rand(2) from dual;  -- 結果爲 0.7311469360199058
select rand(2020) from dual;  -- 結果爲 0.6188119599189963
select rand(20201231) from dual;  -- 結果爲 0.9412005456293369

一般使用Unix時間戳作爲seed

函數名稱:exp(DOUBLE a), exp(DECIMAL a),返回類型:DOUBLE

返回 e 的 a 次方

select exp(1) from dual;  -- 結果爲 2.718281828459045
select exp(1.5) from dual;  -- 結果爲 4.4816890703380645
select exp(2) from dual;  -- 結果爲 7.38905609893065
select exp(0) from dual;  -- 結果爲 1.0
select exp(-1) from dual;  -- 結果爲 0.36787944117144233

函數名稱:ln(DOUBLE a), ln(DECIMAL a),返回類型:DOUBLE

返回以 e 爲底,a 的對數

select ln(0) from dual;  -- 結果爲 NULL
select ln(1) from dual;  -- 結果爲 0.0
select ln(2) from dual;  -- 結果爲 0.6931471805599453
select ln(2.718281828459045) from dual; -- 結果爲 1.0

函數名稱:log10(DOUBLE a), log10(DECIMAL a),返回類型:DOUBLE

返回以 10 爲底,a 的對數

select log10(1) from dual;  -- 結果爲 0.0
select log10(10) from dual;  -- 結果爲 1.0
select log10(0.1) from dual;  -- 結果爲 -1.0

函數名稱:log2(DOUBLE a), log2(DECIMAL a),返回類型:DOUBLE

返回以 2 爲底,a 的對數

select log10(1) from dual;  -- 結果爲 0.0
select log10(10) from dual;  -- 結果爲 1.0
select log10(0.1) from dual;  -- 結果爲 -1.0

函數名稱:log(DOUBLE base, DOUBLE a),log(DECIMAL base, DECIMAL a),返回類型:DOUBLE

返回以 base 爲底,a 的對數

select log(1.1, 1.21) from dual;  -- 結果爲 1.9999999999999982
select log(2, 4) from dual;  -- 結果爲 2.0
select log(3.1, 5) from dual;  -- 結果爲 1.4225162708181491

函數名稱:pow(DOUBLE a, DOUBLE p), power(DOUBLE a, DOUBLE p),返回類型:DOUBLE

返回 a 的 p 次方

select pow(-1, 2) from dual;  -- 結果爲 1.0
select pow(0, 1.21) from dual;  -- 結果爲 0.0
select pow(1.1, 2) from dual;  -- 結果爲 1.2100000000000002

函數名稱:sqrt(DOUBLE a), sqrt(DECIMAL a),返回類型:DOUBLE

返回 a 的 平方根

select sqrt(4) from dual;  -- 結果爲 2.0
select sqrt(1.21) from dual;  -- 結果爲 1.1
select sqrt(-1) from dual;  -- 結果爲 NULL

函數名稱:bin(BIGINT a),返回類型:STRING

返回 a 的 二進制表達式

select bin(-1024) from dual;  -- 結果爲 1111111111111111111111111111111111111111111111111111110000000000
select bin(-1) from dual;  -- 結果爲 1111111111111111111111111111111111111111111111111111111111111111
select bin(1) from dual;  -- 結果爲 1
select bin(1024) from dual;  -- 結果爲 10000000000

函數名稱:hex(BIGINT a) hex(STRING a) hex(BINARY a),返回類型:STRING

如果參數 a 是整數,則返回十六進制表達式,如:

select hex(16) from dual;  -- 結果爲 10
select bin(-1024) from dual;  -- 結果爲 
select bin(-1024) from dual;  -- 結果爲 
select bin(-1024) from dual;  -- 結果爲 

如果參數 a 是字符串,則逐一將字符串中的每個字符對應的ASCII碼以十六進制表示並返回,如:

select hex(16) from dual;  -- 結果爲 10
select hex(11) from dual;  -- 結果爲 B
select hex(-1) from dual;  -- 結果爲 FFFFFFFFFFFFFFFF

函數名稱:unhex(STRING a),返回類型:STRING

hex的逆函數,以十六進制解釋參數 a ,並進行ASCII轉換,返回對應的字符

select unhex('41') from dual;  -- 結果爲 A
select unhex('42') from dual;  -- 結果爲 B
select unhex('4242') from dual;  -- 結果爲 BB

函數名稱:conv(BIGINT num, INT from_base, INT to_base), conv(STRING num, INT from_base, INT to_base),返回類型:STRING

將數字 num 或者字符串 num 從 from_base 進制轉換到 to_base 進制

select conv('1024', 10, 2) from dual;  -- 結果爲 10000000000
select conv(1024, 10, 2) from dual;  -- 結果爲 10000000000
select conv(10000000000, 2, 10) from dual;  -- 結果爲 1024
select conv('A', 16, 10) from dual;  -- 結果爲 1

函數名稱:abs(DOUBLE a),返回類型:DOUBLE

返回 a 的絕對值

select abs('-1.024') from dual;  -- 結果爲 1.024
select abs('1.024') from dual;  -- 結果爲 1.024

函數名稱:pmod(INT a, INT b), pmod(DOUBLE a, DOUBLE b),返回類型:INT or DOUBLE

返回 a 模 b 的值,pmod(a, b) 同 a % b

select pmod(10, 3) from dual;  -- 結果爲 1
select 10 % 3 from dual;  -- 結果爲 1
select pmod(10.1, 2.5) from dual;  -- 結果爲 0.09999999999999964
select 10.1 % 2.5 from dual;  -- 結果爲 0.09999999999999964
select pmod(10, 2.5) from dual;  -- 結果爲 0.0

函數名稱:sin(DOUBLE a), sin(DECIMAL a),返回類型:DOUBLE

返回 a 的正弦值(a以弧度爲單位,1弧度(rad)=57.29578度(°))

select sin(1) from dual;  -- 結果爲 0.8414709848078965
select sin(1 / 57.29578 * 90) from dual;  -- 結果爲 0.9999999999999999

函數名稱:asin(DOUBLE a), asin(DECIMAL a),返回類型:DOUBLE

返回 a 的反正弦值( -1<=a<=1)

select asin(0.8414709848078965) from dual;  -- 結果爲 1.0
select asin(1) * 57.29578 from dual;  -- 結果爲 90.0000007648485
select asin(10) from dual;  -- 結果爲 NaN

函數名稱:cos(DOUBLE a), cos(DECIMAL a),返回類型:DOUBLE

返回 a 的餘弦值

select cos(1) from dual;  -- 結果爲 0.5403023058681398
select cos(1 / 57.29578 * 120) from dual;  -- 結果爲 -0.4999999845857585

函數名稱:acos(DOUBLE a), acos(DECIMAL a),返回類型:DOUBLE

返回 a 的反餘弦值

select acos(0.5403023058681398) from dual;  -- 結果爲 1.0
select acos(0.5) * 57.29578 from dual;  -- 結果爲 60.00000050989901

函數名稱:tan(DOUBLE a), tan(DECIMAL a),返回類型:DOUBLE

返回 a 的正切值

select tan(1) from dual;  -- 結果爲 1.5574077246549023
select tan(1 / 57.29578 * 45) from dual;  -- 結果爲 0.9999999866508755

函數名稱:atan(DOUBLE a), atan(DECIMAL a),返回類型:DOUBLE

返回 a 的反正切值

select atan(1.5574077246549023) from dual;  -- 結果爲 1.0
select atan(1) * 57.29578 from dual;  -- 結果爲 45.00000038242425

函數名稱:degrees(DOUBLE a), degrees(DECIMAL a),返回類型:DOUBLE

弧度(rad)轉爲度(°):1弧度(rad)=57.29577951308232度(°)

select degrees(1) from dual;  -- 結果爲 57.29577951308232

函數名稱:radians(DOUBLE a), radians(DOUBLE a),返回類型:DOUBLE

度(°)轉爲弧度(rad)

select radians(57.29577951308232) from dual;  -- 結果爲 1.0
select radians(90) from dual;  -- 結果爲 1.5707963267948966

函數名稱:positive(INT a), positive(DOUBLE a),返回類型:INT or DOUBLE

返回 a

select positive(1) from dual;  -- 結果爲 1
select positive(-1) from dual;  -- 結果爲 -1
select positive(1.024) from dual;  -- 結果爲 1.024

函數名稱:negative(INT a), negative(DOUBLE a),返回類型:INT or DOUBLE

返回 -a

select negative(1) from dual;  -- 結果爲 -1
select negative(-1) from dual;  -- 結果爲 1
select negative(1.024) from dual;  -- 結果爲 -1.024

函數名稱:sign(DOUBLE a), sign(DECIMAL a),返回類型:DOUBLE or INT

如果 a 是正數,返回 1.0;如果 a 是負數,返回 -1.0;如果 a 是 0,返回 0.0

select sign(2) from dual;  -- 結果爲 1.0
select sign(-2) from dual;  -- 結果爲 -1.0
select sign(0) from dual;  -- 結果爲 0.0
select sign(0) from dual;  -- 結果爲 0.0

函數名稱:e(),返回類型:DOUBLE

返回自然常數 e 的值

select e() from dual;  -- 結果爲 2.718281828459045

函數名稱:pi(),返回類型:DOUBLE

返回圓周率 Pi 的值

select pi() from dual;  -- 結果爲 3.141592653589793

函數名稱:factorial(INT a),返回類型:BIGINT

返回 a 的階乘(n!=1×2×3×...×(n-1)×n)

select factorial(3) from dual;  -- 結果爲 6
select factorial(4) from dual;  -- 結果爲 24

函數名稱:cbrt(DOUBLE a),返回類型:DOUBLE

返回 a 的立方根

select cbrt(8) from dual;  -- 結果爲 2.0
select cbrt(1.331) from dual;  -- 結果爲 1.1

函數名稱:shiftleft(TINYINT|SMALLINT|INT a, INT b),shiftleft(BIGINT a, INT b),返回類型:INT or BIGINT

按位左移

select shiftleft(1, 1) from dual;  -- 結果爲 2
select shiftleft(1, 2) from dual;  -- 結果爲 4
select shiftleft(1024) from dual;  -- 結果爲 111111

函數名稱:shiftright(TINYINT|SMALLINT|INT a, INT b),shiftright(BIGINT a, INT b),返回類型:INT or BIGINT

按位右移

select shiftright(1, 1) from dual;  -- 結果爲 0
select shiftright(1, 1) from dual;  -- 結果爲 0
select shiftright(1024, 1) from dual;  -- 結果爲 512
select shiftright(1024, 0) from dual;  -- 結果爲 1024
select shiftright(1024, -1) from dual;  -- 結果爲 0

函數名稱:shiftrightunsigned(TINYINT|SMALLINT|INT a, INT b),shiftrightunsigned(BIGINT a, INT b),返回類型:DOUBLE

按位無符號右移

select shiftrightunsigned(2, 1) from dual;  -- 結果爲 1
select shiftrightunsigned(1, 1) from dual;  -- 結果爲 0
select shiftrightunsigned(0, 1) from dual;  -- 結果爲 0
select shiftrightunsigned(-1, 1) from dual;  -- 結果爲 2147483647
select shiftrightunsigned(-2, 1) from dual;  -- 結果爲 2147483647

函數名稱:greatest(T v1, T v2, ...),返回類型:T

返回最大值(如果列表中有一個值爲NULL,則返回NULL)

select greatest(2, 3) from dual;  -- 結果爲 3
select greatest('11', '12', '9') from dual;  -- 結果爲 9
select greatest(NULL, 1, 2) from dual;  -- 結果爲 NULL

函數名稱:least(T v1, T v2, ...),返回類型:T

返回最小值(如果列表中有一個值爲NULL,則返回NULL)

select least(2, 3) from dual;  -- 結果爲 2
select least('11', '12', '9') from dual;  -- 結果爲 11
select least(NULL, 1, 2) from dual;  -- 結果爲 NULL

函數名稱:width_bucket(NUMERIC expr, NUMERIC min_value, NUMERIC max_value, INT num_buckets),返回類型:INT

返回一個介於 0 和 num_buckets + 1 之間的整數(基於通過將[min_value,max_value]劃分爲大小相等的區域來生成存儲桶);

如果 expr 小於 min_value 則返回1,如果 expr 大於 max_value 則返回 num_buckets + 1

select width_bucket(2, 1, 10, 5) from dual;  -- 結果爲 1
select width_bucket(1, 2, 11, 5) from dual;  -- 結果爲 1
select width_bucket(11, 1, 10, 5) from dual;  -- 結果爲 6

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章