hive函数应用的案例

hive函数

多字节分隔处理

截屏2022-03-15 17.07.37

截屏2022-03-15 17.09.11

截屏2022-03-16 11.01.25

截屏2022-03-16 11.03.34

截屏2022-03-16 11.05.30

截屏2022-03-16 11.11.09

文件小的时候用python修改,多的时候,用mapreduce分布式处理。把两个|替换成一个| 。

截屏2022-03-16 11.12.39

截屏2022-03-16 11.15.30

截屏2022-03-16 11.18.30

可以找一个在线正则表达式测试网站检查一下。这样挺方便。

第三种方法 ,相当于把第一种方法读的数据先清洗写进脚本,用自己写的脚本替代hive 的读取组件。不推荐使用。

截屏2022-03-17 13.08.44

​ 这里解释一下以上的正则表达式

​ 在大的模式下,有7个()包裹的子模式,模式匹配时,从左至右匹配,每个成功匹配的子模式会被当成hive表中的一个字段。

​ 1号子模式匹配任意多个非空格的字符,192.168.88.134已经匹配,遇到空格,1号子模式匹配失败。

​ 2号子模式匹配任意多个非 } 字符,从1号子模式匹配失败的空格位置往后,一直到换行符,2号子模式匹配失败。

​ 总模式的后面几个括号都没有用上。

截屏2022-03-17 14.22.54

​ 用正确的正则表达式:(注意:java的转义字符”\\“要两个,python一个\,hive是java写的,记得用java的转义字符写法。 )

截屏2022-03-17 16.26.43

url专用解析函数

截屏2022-03-17 16.31.55

截屏2022-03-17 16.33.49

截屏2022-03-17 16.35.42

截屏2022-03-17 16.36.17

截屏2022-03-17 16.38.29

截屏2022-03-17 16.39.10

​ 注意参数要大写,小写不识别。

截屏2022-03-17 16.39.53

截屏2022-03-17 16.41.31

截屏2022-03-17 16.43.58

截屏2022-03-17 16.46.04

截屏2022-03-17 16.47.09

截屏2022-03-17 16.55.30

截屏2022-03-17 16.57.43

截屏2022-03-17 16.58.49

截屏2022-03-17 16.59.26

hive行列转换

多行转多列

截屏2022-03-17 17.38.13

截屏2022-03-17 17.40.21

截屏2022-03-17 17.41.46

截屏2022-03-17 17.42.57

截屏2022-03-17 17.53.02

多行转单列

截屏2022-03-17 18.16.53

截屏2022-03-17 18.17.59

​ concat 拼接的元素有一个为null,拼接结果就是null,concat_ws拼接的元素有不为空的,结果就不会是空。

截屏2022-03-17 18.20.57

collect_list 收集元素保留元素类型,但是concat_ws 只能拼接string 类型,记得有时候要类型转换cast(a as string)。

截屏2022-03-17 18.28.32

多列转多行

截屏2022-03-17 18.30.18

截屏2022-03-17 18.31.14

截屏2022-03-17 18.35.25

单列转多行(重要)

截屏2022-03-17 18.36.17

explode爆炸函数只接受array和map类型输入。

截屏2022-03-17 18.38.57

截屏2022-03-17 18.42.03

json格式处理

截屏2022-03-17 21.30.38

截屏2022-03-17 21.31.40

截屏2022-03-17 21.33.44

截屏2022-03-17 21.34.25

截屏2022-03-17 21.35.03

截屏2022-03-17 21.35.47

截屏2022-03-17 21.36.32

截屏2022-03-17 21.37.06

截屏2022-03-17 21.41.03

截屏2022-03-17 21.42.07

截屏2022-03-17 21.42.54

​ 注意 time用了反引号 引起来了,不然会和 默认的 time 冲突。

连续登录统计

截屏2022-03-17 21.45.31

​ 利用笛卡尔积,把所有的可能性都列出来,再筛选。

截屏2022-03-17 21.53.11

截屏2022-03-17 21.58.29

截屏2022-03-17 22.00.52

截屏2022-03-17 22.01.46

截屏2022-03-17 22.16.13

​ 比较 下一次登录的日期 和 明天的日期,两者相等就是连续登录。

截屏2022-03-17 22.18.49

​ 注意:

1
2
3
4
5
6
7
8
9
select
userid,
logintime,
date_add(logintime,1) as nextday,
lead(logintime,1,0) over(partition by userid order by logintime) as nextlog
from tb_continue_log where nextday=nextlog;
-- 这样是错的! 因为 nextday 和 nextlog 的生成都用到了logintime ,where 不能用他们作判断。
-- Invalid table alias or column reference 'nextday': (possible column names are: userid, logintime)
-- 需要把这个select的结果 做成一个表,用这个新的表的where 缩小范围。

截屏2022-03-17 22.26.25

​ 同样的道理,如果往后推3天,正好是登录的第3天,说明这三天一定是连续登录的 。

​ 连续n 天登录用窗口函数over实现,有共性,比前面的方法要好,前提是要分好组排好序。

级连累加求和

截屏2022-03-19 10.48.31

​ 先自己对自己做cross join 笛卡尔积,但是要用on去限定笛卡尔积的范围,那就是a.userid=b.userid 的部分,用A 和 A 、B 和 B做笛卡尔积。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
注意:

​ 就算是a和b表join+on仍然会有[笛卡尔积]的形式

​ 因为如果a表和b表的id都有1对多的形式时,就是笛卡尔积

​ 比如a中id=1的记录有3条(ID,维修时间),

​ b中id=1的记录有2条(ID,用户上报时间)

​ ,joinon之后就会有6条!

-- 例子: a.id [1,2,3] b.id[1,2,2,3]
-- a join b on a.id=b.id;
-- 先 a 和 b 做笛卡尔积得到 1-1 1-2 1-2 1-3,2-1 2-2 2-2 2-3,3-1 3-2 3-2 3-3。
-- 再 根据on 后的条件做筛选 保留 1-1 2-2 2-2 3-3,有4条。因为a.id=2有一条 b.id=2有两条。

-- 例子:a.id [1,1,1] b.id[1,1,1]
-- a join b on a.id=b.id;
-- 结果是9条,因为 a.id=1有三条 b.id=1有三条。

截屏2022-03-19 10.56.13

截屏2022-03-19 14.59.41

截屏2022-03-19 15.01.35

截屏2022-03-19 15.02.07

窗口函数over里面有order by 外面的sum 就自动是累积排序的了。

截屏2022-03-19 15.09.43

截屏2022-03-19 15.11.54

分组top n

截屏2022-03-19 15.16.12

截屏2022-03-19 15.17.17

截屏2022-03-19 15.18.07

拉链表的设计和实现

截屏2022-03-19 15.20.44

截屏2022-03-19 15.21.56

截屏2022-03-19 15.23.30

截屏2022-03-19 15.24.35

截屏2022-03-19 15.25.24

截屏2022-03-19 15.25.47

截屏2022-03-19 15.31.36

截屏2022-03-19 15.31.57

截屏2022-03-19 15.33.38

截屏2022-03-19 15.35.52

截屏2022-03-19 15.36.49

截屏2022-03-19 15.38.00

截屏2022-03-19 15.39.02

截屏2022-03-19 15.55.59

截屏2022-03-19 16.05.24