Hive函数 -- 总结

目录

一、概述

二、函数

1.字符串相关函数

2.日期相关函数

3.数字相关函数

4.非空校验函数

5.类型转换函数

6.行转列相关函数

7.列转行相关函数

8.窗口函数

8.1概述

8.2细节


一、概述

最初Hive函数分为 内置函数 和 用户自定义函数两大类, 其中用户自定义函数又被分为3类, 分别是:
        用户自定义函数:
            UDF:  全称叫 User Defined Functions, 普通函数, 即: 一进一出.
                例如: select * from stu;
            UDAF: 全称叫 User Defined Aggregation Functions, 聚合函数, 即: 多进一出.
                例如: select count(id) from stu;
            UDTF: 全称叫  User Defined Table-Generating Functions, 表生成函数, 即: 一进多出.
                例如: select explode(array(11, 22, 33));
    现在, hive中的函数没有内置函数 和 自定义函数之分了, 取而代之的是: UDF, UDAF, UDTF.

查看Hive针对于该函数的 说明文档
describe function rand;             -- 查看函数的说明信息(简单信息)
describe function extended rand;    -- 查看函数的说明信息(详细信息), 包括 测试案例

二、函数

1.字符串相关函数

字符串切割
	split    参数1: 要操作的字符串,  参数2: 切割符
		select split('aa, bb, cc', ', ');        -- ["aa","bb","cc"]
	
    substr/substring    参1: 要操作的字符串.  参2: 起始索引, 参数3: 个数
	substr() 和 substring()效果一样, 没有区别.

select substring('2023-05-19 11:51:27', 1, 10);     -- 2023-05-19
select substr('2023-05-19 11:51:27', 1, 10);        -- 2023-05-19

字符串拼接
select concat('aa','bb','cc');                  -- 拼接符: 默认是空, 结果为: aabbcc
select concat_ws('#', 'aa','bb','cc');          -- 指定拼接符, 参1是拼接符, 后续的参数是要拼接的内容. 即: aa#bb#cc

正则替换
	参1: 要被处理的字符串. 参2:正则表达式. 参3: 用来替换的内容
		select regexp_replace('100-200', '\\d+', '夯哥');
	
处理json字符串
		json解析函数:get_json_object(json_txt, path), 细节: 整个json字符串用单引号'包裹, json字符串中的键, 值用双引号"包裹.
json字符串的格式: {键:值, 键: 值}
json数组的格式: [{键:值, 键: 值}, {键:值, 键: 值}, {键:值, 键: 值}]      -- 索引从 0 开始.
		select get_json_object('{"name":"杨过", "age":"18"}', '$.name');      -- 杨过,   $表示json对象
select get_json_object('[{"name":"杨过", "age":"18"}, {"name":"小龙女", "age":"26"}]', '$.[1].name');  - 索引从 0 开始

2.日期相关函数

获取当前时间, 年月日格式
select current_date();

获取年月日
select year('2023-05-19 14:31:02');     -- 2023
select month('2023-05-19 14:31:02');     -- 5
select day('2023-05-19 14:31:02');     -- 19

时间相关操作
select date_add('2023-05-19', 2);       -- 2023-05-21
select date_add('2023-05-19', -2);       -- 2023-05-17
select datediff('2023-05-19', '2023-05-20');    -- 前 - 后,  -1

扩展, 计算某年的2月有多少天
select day(date_add('2023-03-01', -1));
select dayofmonth(date_add('2024-03-01', -1));

3.数字相关函数

rand函数    0.0 ~ 1.0, 包左不包右
	        select rand(); 

四舍五入    原理: +0.5, 然后求地板数
		    select round(4.3);

求绝对值     select abs(-10); 

4.非空校验函数

非空查找    coalesce(值1, 值2....), 获取参数列表中, 第1个非null值
select coalesce(null, null, null);  -- null
select coalesce(null, 11, 22);      -- 11

if函数(条件表达式, 值1, 值2)    先执行条件表达式, 看起结果是否成立, 成立执行值1, 否则执行值2
select if(5 > 3, '郑州', '新乡');   -- 郑州

case when转换
select
    case
        when 5 > 3 then '大于'
        when 5 < 3 then '小于'
        else '等于'
    end as eq ;
select
    case 5
        when 1 then '周1'
        when 3 then '周3'
        when 5 then '周5'
        else '不知道周几, 睡迷糊了!'
    end as week;

5.类型转换函数

select cast(10.3 as int);       -- 10
select cast(10 as string);      -- '10'
select cast('12.3' as double);  -- 12.3
select cast('12.3a' as double);  -- null

6.行转列相关函数

建表
create table row2col2(
    col1 string,
    col2 string,
    col3 int
)row format delimited fields terminated by '\t';

行转列涉及到的函数
		数据采集函数
			collect_list()      采集数据, 可重复, 有序
            collect_set()       采集数据, 唯一, 无序.
		数据拼接函数
			concat()        拼接符: 默认为空.
            concat_ws()     拼接符: 可以自定义.
最终
select
    col1, col2,
    --  cast(col3 as string)            把 col3内容转成 字符串, 方便后续 concat_ws()拼接.
    --  collect_list(cast(col3 as string))   把 col3列的内容, 全部采集到, 有序, 可重复.
    --  concat_ws('-', collect_list(cast(col3 as string)))  把上述的内容, 按照-,拼接到一起.
    concat_ws('-', collect_list(cast(col3 as string))) as col3
from row2col2 group by col1, col2;

7.列转行相关函数

建表
		create table col2row2(
    col1 string,
    col2 string,
    col3 string
)row format delimited fields terminated by '\t';

列转行涉及到的函数
	字符串切割函数    split
	数据爆炸函数      explode
	侧视图           lateral view
	
最终
select t1.col1, t1.col2, t2.col3 from col2row2 t1
lateral view explode(split(col3, ',')) t2 as col3;

8.窗口函数

8.1概述

窗口函数指的是 over()函数, 它可以结合特定的函数一起使用, 完成不同的功能.
    目的/作用:
        窗口函数 = 给表新增一列, 至于新增的内容是什么, 取决于窗口函数和什么函数一起使用.
    格式:
        能和窗口函数一起使用的函数 over(partition by 分组字段 order by 排序字段 rows between 起始行 and 结束行)
    能和窗口函数一起使用的函数解释:
        聚合函数: count(), sum(), max(), min(), avg()
        排序函数: row_number(), rank(), dense_rank(), ntile()
        其它函数: lag(), lead(), first_value(), last_value()

8.2细节

1. 窗口函数相当于给表新增一列, 至于新增的内容是什么, 取决于窗口函数和什么函数一起使用.
2. 如果不写partition by, 表示: 统计表中所有的数据, 如果写了 表示统计组内所有的数据.
3. 如果不写order by, 表示: 统计组内所有的数据, 如果写列, 表示统计组内第一行截止到当前行的数据.
4. rows between表示统计的范围, 它可以写的关键字如下:
            unbounded preceding    第一行
            unbounded following   最后一行
            n preceding           向上几行
            n following           向下几行
            current row           当前行
5. ntile(数字)表示几分之几, 里边的数字表示把数据分成几份, 如果不够分, 优先参考最小分区.
           例如: 7条数据分成3份, 则最终结果为:  1, 1, 1    2, 2    3, 3

窗口 + 聚合	
求出网站总的pv数 所有用户所有访问加起来
		select *, sum(pv) over() as total_pv from website_pv_info; 
-- 不写partition by 表示统计表中所有的数据.
	
求出每个用户总pv数
select *, sum(pv) over(partition by cookieid) as total_pv from website_pv_info;                                            -- 写partition by 统计组内所有的数据.	
如果写了order by(表示排序):     则默认操作 组内第一行 至 当前行的数据
        select *, sum(pv) over(partition by cookieid order by createtime) as total_pv 
from website_pv_info;
		
上述的代码, 等价于如下的内容:
select *, 
        sum(pv) over(partition by cookieid 
		order by createtime 
		rows between unbounded preceding and current row ) 
		as total_pv 
from website_pv_info;

需求: 统计每个cookieID的pv(访问量), 只统计: 当前行及 向前3行 向后1行
		select *, 
    sum(pv) over(partition by cookieid 
	   order by createtime 
	   rows between 3 preceding and 1 following ) 
	   as total_pv 
from website_pv_info;

窗口 + 排序
排序函数指的是: row_number(), rank(), dense_rank()
		例如: 数据是100, 90, 90, 60, 则: row_number是: 1, 2, 3, 4,  rank: 1, 2, 2, 4,  dense_rank: 1, 2, 2, 3

需求: 根据cookieID进行分组, 获取每组点击量最高的前4名数据
		with t1 as (
    select
       *,
       dense_rank() over (partition by cookieid order by pv desc) drk
    from website_pv_info
)
select * from t1 where drk <= 4;
	ntile
		ntile(数字,表示分成几份)  采用均分策略, 每份之间的差值不超过1, 优先参考最小的那个部分, 即: 7分成3份, 则是: 3, 2, 2
		需求: 按照cookieid分组, 按照点击量降序排列, 只要每组前三分之一的数据
			with t1 as (
    select
           *,
           ntile(3) over (partition by cookieid order by pv desc) nt
    from website_pv_info
)
select * from t1 where nt = 1;

窗口 + 其它
	LAG    概述    用于统计窗口内往上第n行值
		   格式:  lag(字段, n, 默认值)  向上获取字段的第n个值, 如果没有写写默认值, 找不到就是null, 如果写了默认值, 找不到就用默认值.
		需求: 显示用户上一次的访问时间
select
       *,
       -- 向上1个, 找到就显示, 找不到就显示为 null
       lag(createtime) over(partition by cookieid order by createtime) `lag1`,
       -- 向上2个, 找到就显示, 找不到就用默认值: '2023-05-20 10:52:05'
       lag(createtime, 2, '2023-05-20 10:52:05') over(partition by cookieid order by createtime) `lag2`
from website_url_info;
	LEAD
	FIRST_VALUE
		取分组内排序后,截止到当前行,第一个值
	LAST_VALUE
		取分组内排序后,截止到当前行,最后一个值

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一、关系运算: 4 1. 等值比较: = 4 2. 不等值比较: 4 3. 小于比较: < 4 4. 小于等于比较: 5 6. 大于等于比较: >= 5 7. 空值判断: IS NULL 5 8. 非空判断: IS NOT NULL 6 9. LIKE比较: LIKE 6 10. JAVA的LIKE操作: RLIKE 6 11. REGEXP操作: REGEXP 7 二、数学运算: 7 1. 加法操作: + 7 2. 减法操作: - 7 3. 乘法操作: * 8 4. 除法操作: / 8 5. 取余操作: % 8 6. 位与操作: & 9 7. 位或操作: | 9 8. 位异或操作: ^ 9 9.位取反操作: ~ 10 三、逻辑运算: 10 1. 逻辑与操作: AND 10 2. 逻辑或操作: OR 10 3. 逻辑非操作: NOT 10 四、数值计算 11 1. 取整函数: round 11 2. 指定精度取整函数: round 11 3. 向下取整函数: floor 11 4. 向上取整函数: ceil 12 5. 向上取整函数: ceiling 12 6. 取随机数函数: rand 12 7. 自然指数函数: exp 13 8. 以10为底对数函数: log10 13 9. 以2为底对数函数: log2 13 10. 对数函数: log 13 11. 幂运算函数: pow 14 12. 幂运算函数: power 14 13. 开平方函数: sqrt 14 14. 二进制函数: bin 14 15. 十六进制函数: hex 15 16. 反转十六进制函数: unhex 15 17. 进制转换函数: conv 15 18. 绝对值函数: abs 16 19. 正取余函数: pmod 16 20. 正弦函数: sin 16 21. 反正弦函数: asin 16 22. 余弦函数: cos 17 23. 反余弦函数: acos 17 24. positive函数: positive 17 25. negative函数: negative 17 五、日期函数 18 1. UNIX时间戳转日期函数: from_unixtime 18 2. 获取当前UNIX时间戳函数: unix_timestamp 18 3. 日期转UNIX时间戳函数: unix_timestamp 18 4. 指定格式日期转UNIX时间戳函数: unix_timestamp 18 5. 日期时间转日期函数: to_date 19 6. 日期转年函数: year 19 7. 日期转月函数: month 19 8. 日期转天函数: day 19 9. 日期转小时函数: hour 20 10. 日期转分钟函数: minute 20 11. 日期转秒函数: second 20 12. 日期转周函数: weekofyear 20 13. 日期比较函数: datediff 21 14. 日期增加函数: date_add 21 15. 日期减少函数: date_sub 21 六、条件函数 21 1. If函数: if 21 2. 非空查找函数: COALESCE 22 3. 条件判断函数:CASE 22 4. 条件判断函数:CASE 22 七、字符串函数 23 1. 字符串长度函数:length 23 2. 字符串反转函数:reverse 23 3. 字符串连接函数:concat 23 4. 带分隔符字符串连接函数:concat_ws 23 5. 字符串截取函数:substr,substring 24 6. 字符串截取函数:substr,substring 24 7. 字符串转大写函数:upper,ucase 24 8. 字符串转小写函数:lower,lcase 25 9. 去空格函数:trim 25 10. 左边去空格函数:ltrim 25 11. 右边去空格函数:rtrim 25 12. 正则表达式替换函数:regexp_replace 26 13. 正则表达式解析函数:regexp_extract 26 14. URL解析函数:parse_url 26 15. json解析函数:get_json_object 27 16. 空格字符串函数:space 27 17. 重复字符串函数:repeat 27 18. 首字符ascii函数:ascii 28 19. 左补足函数:lpad 28 20. 右补足函数:rpad 28 21. 分割字符串函数: split 28 22. 集合查找函数: find_in_set 29 八、集合统计函数 29 1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31 8. 总体标准偏离函数: stddev_pop 31 9. 样本标准偏离函数: stddev_samp 31 10.中位数函数: percentile 31 11. 中位数函数: percentile 31 12. 近似中位数函数: percentile_approx 32 13. 近似中位数函数: percentile_approx 32 14. 直方图: histogram_numeric 32 九、复合类型构建操作 32 1. Map类型构建: map 32 2. Struct类型构建: struct 33 3. array类型构建: array 33 十、复杂类型访问操作 33 1. array类型访问: A[n] 33 2. map类型访问: M[key] 34 3. struct类型访问: S.x 34 十一、复杂类型长度统计函数 34 1. Map类型长度函数: size(Map) 34 2. array类型长度函数: size(Array) 34 3. 类型转换函数 35

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值