Hive常见的计算(连续纸,topN,行专列,列转行)

目录

1. 连续值

第1步:先按照条件开窗分组排序,得到分组排序的结果。排序字段值 减去 排序序列号

第2步:按照用户id 和 差值gid 分组。聚合得到一个总行数count,再按照连续值去过滤总行数count。

2. topN

第1步:开窗分组排序

第2步:求相邻排名间的分差,

3. 行转列

 翻转转换

step a. 按照用户分组

step b. 使用case when 新增字段,并赋值。

分组聚拢

step a. 按照用户分组

step b. 使用concat_ws等函数进行聚拢操作。

4. 列转行

5.  json字符串,字符串组的解析


1. 连续值

例如连续7天登录的用户,连续3天消费的用户等。

这主要是要有转换的思想。

将连续性转换为 ==》 差值相同

将连续值转换为 ==》 按照差值分组聚合的行数

step A- 需要开窗,在窗口内进行分组排序,上排序序列号gid

step B- 使用当前的排序字段值a 减去 排序序列号gid ( a - gid) ,得到新的一列。

step C- 再将连续值转换为判断差值大小,按照用户和差值分组。差值相同说明日期是连续的。根据求的连续值,去过滤步骤2得到的值,得到最终的结果集。

例如:求连续7天登录的用户。

数据: 第1列为用户ID, 第2列为登录日期,第3列为登录结果(1为成功,0为失败,即没有登录)

-- user_id dt status(1 正常登录,0 异常)
1 2019-07-11 1
1 2019-07-12 1
1 2019-07-13 1
1 2019-07-14 1
1 2019-07-15 1
1 2019-07-16 1
1 2019-07-17 1
1 2019-07-18 1
2 2019-07-11 1
2 2019-07-12 1
2 2019-07-13 0
2 2019-07-14 1
2 2019-07-15 1
2 2019-07-16 0
2 2019-07-17 1
2 2019-07-18 0
3 2019-07-11 1
3 2019-07-12 1
3 2019-07-13 1
3 2019-07-14 0
3 2019-07-15 1
3 2019-07-16 1
3 2019-07-17 1
3 2019-07-18 1

按照步骤,

第1步:先按照条件开窗分组排序,得到分组排序的结果。排序字段值 减去 排序序列号

这里求得是用户,即按照用户分组,连续7天,按照登录日期排序。日期字段值 - 排序序列号。这个差值如果相同,说明日期连续

-- 开窗排序, 开窗函数 over()
over(partiton by user_id order by dt)

-- 排名函数,给局部排序的上序列号,
-- rank(),排名可以重复,相同排名的后续会有空位。即 1,2,3,3,5
-- DENSE_RANK(), 排名可以重复,相同排名的后续不会有空位,1,2,3,3,4,5
-- 这里排名 顺序增加 且 排名不会重复。使用 row_number()

row_number() over(partiton by user_id order by dt)

-- 求排序字段的当前值 和 排序序列号 的差值。 这里是日期的求值,直接使用date_sub
date_sub(dt,row_number() over(partition by user_id order by dt))

-- 最终第一步的sql是

select user_id,
       dt,   
       date_sub(dt,row_number() over(partition by user_id order by dt)) gid
from user_login
where status = 1

第2步:按照用户id 和 差值gid 分组。聚合得到一个总行数count,再按照连续值去过滤总行数count。

-- 根
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值