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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容