Hive详细讲解-各类函数速通
文章目录
- 1.查看系统中内置函数
- 2.查看某个函数细节
- 3.单行函数
- 3.1算数函数
- 3.2数值函数
- 3.3字符串函数
- 3.4regexp_replace正则替换
- 3.5regexp正则匹配
- 3.6repeat
- 3.7split切割函数
- 3.8nvl函数
- 3.9concat拼接函数
- 3.10解析json字符串 get_json_object
- 4.日期函数
- 4.1时间戳函数
- 4.2将时间戳转化为日期
- 4.3获取当前日期
- 4.3日期运算
- 5.流程控制函数
- 5.1case when()
- 5.2 if写法
- 6.集合函数
- 6.1见名知意array_contains()
- 6.2 map函数
- 6.3结构体
- 7.高级聚合函数
- 8.炸裂函数(hive独有)-UDTF函数
- 1. **最外层查询**
- 2. **子查询 `t2`**
- 9.窗口函数
- 9.窗口函数常用补充
1.查看系统中内置函数
show functions
2.查看某个函数细节
- 可以看到hive中源码的全类名
今天将老师讲的东西总结;总结完成后删除此条信息
3.单行函数
3.1算数函数
运算符较为简单,但是请注意取反操作是~
老师说法:&与运算会先将数字转化为2进制然后进行运算
3.2数值函数
- round四舍五入
- ceil上取整
- floor下取整
- 可以设置返回小数个数
3.3字符串函数
- substring
三个参数,第三个可选
和之前的limit两个数量的参数一样
第二个参数表示从哪里开始截取
第三个参数表示截取几个!
特别注意,索引从1开始
和python一样支持负数,例如substring(‘abc’,-1)
- replace替换函数
此处的替换,还是全局替换而非局部替换。
3.4regexp_replace正则替换
正则表达式 | 描述 | 示例 | 匹配结果 |
---|---|---|---|
. | 匹配除换行符外的任意字符 | a.b | acb , a1b |
\d | 匹配一个数字(0-9 ) | \d\d | 12 , 34 |
\D | 匹配非数字字符 | \D | a , - |
\w | 匹配字母、数字、下划线 | \w+ | abc123 , _x_ |
\W | 匹配非字母、数字、下划线 | \W | ! , @ |
\s | 匹配空白字符(空格、制表符等) | \s+ | 空格、制表符等 |
\S | 匹配非空白字符 | \S+ | abc , 123 |
^ | 匹配行的开头 | ^abc | abc123 |
$ | 匹配行的结尾 | 123$ | abc123 |
* | 匹配前一个字符 0 次或多次 | a* | ``, a , aaa |
+ | 匹配前一个字符 1 次或多次 | a+ | a , aaa |
? | 匹配前一个字符 0 次或 1 次 | a? | ``, a |
{n} | 匹配前一个字符恰好 n 次 | a{3} | aaa |
{n,} | 匹配前一个字符至少 n 次 | a{2,} | aa , aaa |
{n,m} | 匹配前一个字符至少 n 次,至多 m 次 | a{2,4} | aa , aaa |
[abc] | 匹配括号内任意一个字符 | [abc] | a , b , c |
[^abc] | 匹配不在括号内的任意字符 | [^abc] | d , 1 , ! |
特别注意:
[^abc]
+
\S
\s
.
\D
- 正则表达式的使用,请你注意转义
3.5regexp正则匹配
3.6repeat
3.7split切割函数
- split切割第二个参数出来的是一个正则表达式
- 切割出来是一个array
- 切割出来索引从0开始
3.8nvl函数
- 传入两个参数
- 判断第一个参数是否为空,若不空返回第一个参数值,为空返回出第二个参数。
3.9concat拼接函数
- 注意点concat可以将传入的任意str拼接
3.10解析json字符串 get_json_object
-
返回值string
-
json文件表示一个对象会以{ 开头
-
json表示一个数组会以[开头
4.日期函数
日期:年月日
时间:时分秒
4.1时间戳函数
-
unix_timestamp:返回当前或指定时间的时间戳
-
时间戳指的是1970年到当前的秒数
-
当前时刻时间戳全世界同一时刻相同
-
10位时间戳表示秒,13位表示毫秒
- 可以指定时间时间戳
此处的时间格式和Java相同
4.2将时间戳转化为日期
- from_unixtime()
- 两个参数,第二个参数可选,可以转指定格式
4.3获取当前日期
4.3日期运算
-
过于繁琐,直接列到下面,用的时候直接拿来用即可
-
唯一有用的也就data_format
5.流程控制函数
5.1case when()
感觉有点像linux shell
- 可以简化写法
5.2 if写法
6.集合函数
- 集合函数就是处理复杂数据类型
6.1见名知意array_contains()
和Java一样都是contains,然后返回true还是false。
- 此外常见size()
6.2 map函数
和Java一样,但是返回的是数组类型。
6.3结构体
7.高级聚合函数
- collect_list()返回一个数组
- collect_set()返回一个数组
8.炸裂函数(hive独有)-UDTF函数
- explode(map|array)
array
: 一个数组,每个元素将被展开为一行。
map
: 一个映射类型(key-value对),会将每个key-value
对展开为一行,分别返回key
和value
。
- DUTF指标函数
posexplode()返回函数值以及字典索引
使用EXPLODE
时必须搭配LATERAL VIEW
来展开数据。
NULL值处理: 如果array
或map
是NULL
,EXPLODE
将返回0行。
多次使用: 如果有多个嵌套的array
或map
,可以使用多次LATERAL VIEW
进行展开。
- 通常情况下lateral view和udtf函数配合使用。
- 基本语法
hobby显然原始表字段没有,因此需要lateral view结合爆裂函数进行操作;
- tmp表示UDTF炸出来的表的名字 tmp表的别名必须存在
- hobby表示tmp每一个字段的别名;
这段 Hive SQL 语句可以分解为几个步骤来理解。以下是详细的拆解和解释:
1. 最外层查询
sql复制代码select cate, count(*) from ( -- 内层子查询 )t2 group by cate;
功能:
- 统计每个
cate
(分类)的数量(count(*)
)。- 数据来源是子查询
t2
,按cate
分组(group by cate
)。
2. 子查询
t2
sql复制代码select movie, cate from ( -- 更内层子查询 )t1 lateral view explode(cates) tmp as cate
功能:
- 从
t1
中提取每个电影(movie
)及其单个分类(cate
)。lateral view explode(cates)
:将数组cates
展开为多行,每行包含一个分类(cate
)。
insert overwrite table movie_info
values ("《疑犯追踪》", "悬疑,动作,科幻,剧情"),
("《Lie to me》", "悬疑,警匪,动作,心理,剧情"),
("《战狼2》", "战争,动作,灾难");
-- lateral view explode(category) tmp as cate
select
cate,
count(*)
from
(
select
movie,
cate
from
(
select
movie,
split(category,',') cates
from movie_info
)t1 lateral view explode(cates) tmp as cate
)t2
group by cate;
9.窗口函数
- 窗口,函数(直接拿聚合函数来用即可)
- 窗口定义计算范围,函数定义计算逻辑
绝大多数聚合函数都可以配合窗口函数直接使用
基于值的order by表示你基于哪个字段来进行窗口范围划分
- 窗口函数示例
- sum() over() tablename
- 支持内部排序,order by order_data
- rows between a and b
- unbounded preceding表示第一行
- current row 表示当前行
- 整体来看也就是排序后的表 amount按照第一行加到当前行返回结果;
- 基于值的窗口划分
- order by指定比较字段为order_data
- 接着按照order_data按照 -无穷(unbounded preceding)到当前值(current row)来进行比较
- 窗口函数分区
定义分区字段,然后窗口函数作用到每一个分区上
相较于传统的窗口函数,多了个partition by
此外其他一样。
我的理解:
必要字段:聚合函数() over(order by rows|range between * and *) column_name;
其他若分区,写partition by即可
9.窗口函数常用补充
-
跨行取值函数
-
lead取下一行、lag取上一行
拿到每一个订单间隔多少日期,上一个日期,下一个日期的下单时间
- first_value,last_value获取第一行和最后一行某一个字段值
但是hive提供额外参数,是否跳过空值
-
rank,dense_rank,row_number排名函数
-
使用该类函数,你仅需要考虑partition by 和order by即可,不需要考虑窗口范围