【Hive】6-Hive函数、运算符使用

Hive函数、运算符使用

Hive内置运算符

概述
  • 整体上,Hive支持的运算符可以分为三大类:关系运算、算术运算、逻辑运算。

  • 官方参考文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

  • 也可以使用下述方式查看运算符的使用方式。

    -- 显示所有的函数和运算符
    show functions;
    -- 查看运算符或者函数的使用说明
    describe function count;
    -- 使用extended可以查看更加详细的使用说明
    describe function extended count;
    
关系运算符

关系运算符是二元运算符,执行的是两个操作数的比较运算。

每个关系运算符都返回boolean类型结果(TRUE或FALSE)。

在这里插入图片描述

算术运算符

算术运算符操作数必须是数值类型。分为一元运算符和二元运算符:

一元运算符只有一个操作数;二元运算符有两个操作数,运算符在两个操作数之间。

在这里插入图片描述

逻辑运算符

在这里插入图片描述

Hive函数入门

分类标准

Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF (User-Defined Functions ) :

内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;

用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。

用户定义函数UDF分类标准

根据函数输入输出的行数
UDF (User-Defined-Function)普通函数,一进一出

UDAF (User-Defined Aggregation Function)聚合函数,多进一出

UDTF (User-Defined Table-Generating Functions)表生成函数,一进多出

在这里插入图片描述

UDF分类标准扩大化

UDF分类标准本来针对的是用户自己编写开发实现的函数。UDF分类标准可以扩大到Hive的所有函数中:包括内置函数和用户自定义函数。

因为不管是什么类型的函数,一定满足于输入输出的要求,那么从输入几行和输出几行上来划分没有任何问题。千万不要被UD (User-Defined)这两个字母所迷惑,照成视野的狭隘。

比如Hive官方文档中,针对聚合函数的标准就是内置的UDAF类型。

在这里插入图片描述

内置函数
  • 内置函数(build-in)指的是Hive开发实现好,直接可以使用的函数,也叫做内建函数。

  • 官方文档地址: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

  • 内置函数根据应用归类整体可以分为8大种类型:字符串函数、日期函数、数学函数、条件函数、数据脱敏函数、集合函数、类型转换函数、其它杂项函数

字符串函数
------------String Functions字符串函数------------
-- 字符串连接函数: concat(str1, str2, ... strN),不可以指定分隔符;任意一个元素为null,结果就为null
select concat("angela", "baby");	-- angelababy
-- 带分隔符字符串连接函数:concat_ws(separator,[string / array(string)]),可以指定分隔符;任意一个元素不为null,结果就不为null
select concat_ws('.','www',array('aiw', 'com'));	-- www.aiw.com
-- 字符串截取函数: substr(str,pos[,len])或者substring(str,pos[,len]),pos是从1开始的索引,如果为负数则倒着数
select substr("angelababy",-2);		-- by
select substr("angelababy",2,2);	-- ng
-- 正则表达式替换函数: regexp_replace(str,regexp,rep)
select regexp_replace('100-200', '(\\d+)', 'num');	--num-num
-- 正则表达式解析函数: regexp_extract(str, regexp[,idx])提取正则匹配到的指定组内容
select regexp_extract('100-200', '(\\d+)-(\\d+)',1);	-- 100
select regexp_extract('100-200', '(\\d+)-(\\d+)',2);	-- 200
-- URL解析函数: parse_url 注意要想一次解析出多个可以使用parse_url_tuple这个UDTF函数
select parse_url('http://www.aiw.com/path/p1.php?query=1','HOST');	-- www.aiw.com
-- 分割字符串函数: split(str,regex)
select split('apache hive', '\\s+');	-- ["apache","hive"]
-- json解析函数: get_json_object(json_txt,path),用于解析JSON字符串,可以从JSON字符串中返回指定的某个对象列的值;
-- 特点:每次只能返回JSON对象中一列的值
-- $表示json对象;通过$.columnName的方式来指定path
select get_json_object('[{"website":"www.aiw.cn","name":"allenwoon"}]','$.[0].website');		-- www.aiw.cn
-- 字符串长度函数: length(str / binary)
select length("angelababy");	-- 10
-- 字符串反转函数: reverse
select reverse ("angelababy");	-- ybabalegna
-- 字符串转大写函数: upper,ucase
select upper("angelababy");		-- ANGELABABY
select ucase("angelababy");		-- ANGELABABY
-- 字符串转小写函数: lower,lcase
select lower("ANGELABABY");		-- angelababy
select lcase("ANGELABABY");		-- angelababy
-- 去空格函数: trim去除左右两边的空格
select trim(" angelababy ");	-- angelababy
-- 左边去空格函数: ltrim
select ltrim(" angelababy");	-- angelababy
-- 右边去空格函数: rtrim
select rtrim("angelababy ");	-- angelababy
-- 空格字符串函数:space(n),返回n个空格的字符串
select space(3);
-- 重复字符串函数:repeat(str,n),重复str为n次。
select repeat('aiw',2);			-- aiwaiw
-- 首字符ascii函数:ascii(str),返回 str 的第一个字符的数值。
select ascii('aiw');			-- 97
-- 左补足函数
select lpad('aiw',5,'@');		-- @@aiw
-- 右补足函数
select rpad('aiw',5,'@');		-- aiw@@
-- 集合查找函数
select find_in_set('ab','abc,b,ab,c,def');	-- 3
日期函数
------------Date Functions日期函数------------
-- 获取当前日期: current_date
select current_date(),current_date;		-- 2024-08-25	2024-08-25	
-- 获取当前时间:current_timestamp
-- 同一查询中对current_timestamp的所有调用均返回相同的值。
select current_timestamp(),current_timestamp;	-- 2024-08-25 15:56:21.820	2024-08-25 15:56:21.820
-- timestamp类型转date类型
select date_format(current_timestamp, 'yyyy-MM-dd'),date(current_timestamp);  -- 2024-10-22	2024-10-22
-- 获取当前UNIX时间戳函数:unix_timestamp,默认获取的是UTC时间戳
select unix_timestamp();	-- 1724572684
-- 日期转UNIX时间戳函数: unix_timestamp
select unix_timestamp ('2011-12-07 13:01:03');	-- 1323262863
-- 指定格式日期转UNIX时间戳函数:unix_timestamp
select unix_timestamp ('20111207 13:01:03', 'yyyyMMdd HH:mm:ss');	-- 1323262863
-- UNIX时间戳转日期函数:from_unixtime
select from_unixtime(1724572684, 'yyyy-MM-dd HH:mm:ss');	-- 2024-08-25 07:58:04
select from_unixtime(0, 'yyyy-MM-dd HH:mm:ss');		-- 1970-01-01 00:00:00
select from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss');	-- 2024-08-25 08:01:27	默认是UTC时间,比北京时间少8个小时
SELECT from_unixtime(cast(unix_timestamp() as bigint) + 8 * 3600, 'yyyy-MM-dd HH:mm:ss');	-- 2024-08-25 16:06:08	转化为北京时间
-- 日期比较函数: datediff日期格式要求'yyyy-MM-dd HH:mm:ss' or 'yyyy-MM-dd'
select datediff('2012-12-08','2012-05-09');		-- 213
-- 日期增加函数: date_add
select date_add('2012-02-28',10);		-- 2012-03-09
-- 日期减少函数: date_sub
select date_sub('2012-01-1',10);		-- 2011-12-22
-- 抽取日期函数: to_date
select to_date('2009-07-30 04:17:52');		-- 2009-07-30
-- 日期转年函数: year
select year('2009-07-30 04∶17:52');			-- 2009
-- 日期转月函数;month
select month('2009-07-30 04∶17:52');			-- 7
-- 日期转天函数:day
select day('2009-07-30 04:17:52');			-- 30
-- 日期转小时函数: hour
select hour('2009-07-30 04:17:52');			-- 4
-- 日期转分钟函数: minute
select minute('2009-07-30 04:17:52');		-- 17
-- 日期转秒函数:second
select second('2009-07-30 04:17:52');		--52
-- 日期转周函数: weekofyear返回指定日期所示年份第几周
select weekofyear('2009-07-30 04:17:52');	-- 31
数学函数
------------Mathematical Functions数学函数------------
-- 取整函数: round返回double类型的整数值部分(遵循四舍五入)
select round(3.1415926);	-- 3
-- 指定精度取整函数: round(double a, int d)返回指定精度d的double类型
select round(3.1415926,4);	-- 3.1416
-- 向下取整函数:floor
select floor(3.1415926);	-- 3
select floor(-3.1415926);	-- -4
-- 向上取整函数: ceil
select ceil(3.1415926);		-- 4
select ceil(-3.1415926);	-- -3
-- 取随机数函数: rand每次执行都不一样返回一个0到1范围内的随机数
select rand();				-- 0.05960270647504262
-- 指定种子取随机数函数:rand(int seed)得到一个稳定的随机数序列,比如上下均获取同一个随机数值
select rand(2);				-- 0.7311469360199058
-- 二进制函数:bin(BIGINT a),将数字转化为二进制格式
select bin(6);		-- 110
-- 绝对值函数
select abs(-9);		-- 9
-- 进制转化函数
select conv(6,10,2);	-- 110,将6从10进制转化为2进制
select conv(110,2,10);	-- 6,将110从2进制转化为10进制
集合函数
------------Collection Functions集合函数------------
-- 集合元素size函数: size(Array<T>)、size(Map<K.V>) 
select size(array(11,22,33));	-- 3
select size(map("id",10086,"name","zhangsan","age",18));	-- 3
-- 取map集合keys函数: map_keys (Map<K.V>)
select map_keys(map("id",10086,"name","zhangsan","age",18));	-- ["id","name","age"]
-- 取map集合values函数: map_values(Map<K.V>)
select map_values(map("id",10086,"name","zhangsan","age",18));	-- ["10086","zhangsan","18"]
-- 判断数组是否包含指定元素: array_contains(Array<T>, value)
select array_contains(array(11,22,33),11);	-- true
select array_contains(array(11,22,33),66);	-- false
-- 数组排字函数: sort_array(Array<T>),只能升序
select sort_array(array(12,2,32));			-- [2,12,32]
-- 将一列中的多行合并为一行,并进行去重
with tmp as (select 2 as col union all select 3 as col union all select 2 as col)
select collect_set(t.col) from tmp t;	-- [2,3]
-- 将一列中的多行合并为一行,不进行去重
with tmp as (select 2 as col union all select 3 as col union all select 2 as col)
select collect_list(t.col) from tmp t;	-- [2,3,2]
条件函数
------------Conditional Functions条件函数------------
-- if条件判断: if(boolean testCondition, T valueTrue, T valueFalseOrNull)
select if(1=2,100,200);		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杼蛘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值