函数
hive中有很多内置函数可以使用
查看内置函数
1 | show functions; |
查看函数的用法及作用
1 | desc function floor_day; |
查看函数的详细用法
1 | desc function extended floor_day; |
函数分类
hive中函数分为三类
- UDF 一进一出
- UDAF 多进一出
- UDTF 一进多出
多是指多行
常用函数
nvl空字段赋值
1 | # 用来给某个字段赋默认值 |
concat字符拼接
concat
1 | # 返回字符串拼接之后的结果,参数为多个字符串 |
concat_ws
1 | # 第一个参数为分隔符,剩余参数可以使字符串也可以是数组 |
collect_set汇总
1 | # 将数据汇总后转为数组输出 |
split切割
1 | # 根据表达式进行切割字符串 |
explode拆分
1 | # 将数组或者map结构的数据拆分为多行 |
lateral view(侧视图)可以配合explode来进行使用,将单行数据拆解成多行的数据集
1 | -- 这里的category存储的是视频的分类数组 |
时间格式处理
date_format函数
仅支持yyyy-MM-dd、yyyy-MM-dd HH:mm:ss这种标准格式
1 | select date_format('2024-04-07 13:24:20', 'yyyyMMdd') |
from_unixtime函数
时间戳转成对应的日期格式
1 | select from_unixtime(1570377600,'yyyyMMdd') |
unix_timestamp函数
格式化日期转时间戳
1 | select unix_timestamp('2019/10/7','yyyy/MM/dd') |
from_unixtime+unix_timestamp组合
既然date_format支持的格式比较少,那么可以用from_unixtime+unix_timestamp来进行其他日期格式的格式化
1 | select from_unixtime(unix_timestamp('2019/10/7','yyyy/MM/dd'),'yyyyMMdd') |
over窗口函数
指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化
以一个小数据为例,该表中只有四条数据
1 | hive (study_hive)> select * from test_partitioned; |
在使用窗口函数时,如果窗口函数中没有加任何任何条件时,是将查询出来的整个数据集作为窗口,此时这个sum函数是根据这个窗口所传进来的数据进行计算的,即20+50=70
1 | hive (study_hive)> select id,sum(money) over() from test_partitioned where `date` = '20210413'; |
在over中可以对数据窗口进行限制,如使用partition by 根据字段的值进行限制,sum所对应的也是按照该数据集中的id进行分组然后在进行求和
1 | hive (study_hive)> select id,sum(money) over(partition by `date`) from test_partitioned; |
高级用法
over中的可用窗口函数,在使用order by时使用
如果order by之后没有使用特殊的窗口函数,默认则是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(从开始到当前行)
如果没有使用order by也没有使用特殊的窗口函数,默认则是ROW BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING(从头到尾)
1 | CURRENT ROW:当前行 |
语法
1 | (ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING) |
示例:
1 | -- 按照c分组 按照d排序 取前三行和后三行的平均值 |
over前的窗口函数
1 | LAG(col,n,default_val):往前第 n 行数据 |
示例:
1 | SELECT a, LAG(a, 3, 0) OVER (PARTITION BY b ORDER BY C)FROM T; |
rank函数
rank有三个函数
- RANK() 排序相同时会重复,总数不会变
- DENSE_RANK() 排序相同时会重复,总数会减少
- ROW_NUMBER() 会根据顺序计算
全部数据
1 | test_partitioned.id test_partitioned.money test_partitioned.date |
分别进行测试验证
RANK()
1 | select *,rank() over(order by money) from test_partitioned; |
使用money进行排序,money相同的rank值是一样的,排序相同时会重复,但是总数不会变,3 3 5
DENSE_RANK()
1 | select *,dense_rank() over(order by money) from test_partitioned; |
使用money进行排序,money相同的rank值是一样的,排序相同时会重复,但是总数会减少,3 3 4
ROW_NUMBER()
1 | select *,row_number() over(order by money) from test_partitioned; |
使用money进行排序,money相同的rank值也会按照顺序进行排序,完全不会重复