Hive Sql实现高难度的 sql 需求

本文通过一个实例展示了如何使用Hive SQL查询每个用户相邻两次浏览时间差小于三分钟的次数。解题过程中详细解析了正则替换、日期格式化、窗口函数row_number()以及时间差计算等关键步骤,适合对Hive SQL感兴趣的读者学习。
摘要由CSDN通过智能技术生成

题目:

(1).前置条件:

有以下数据集I,表查询结果如下图所示,设置该表为表:test_user_scan。

(2).题目要求:

使用 hive sql 查询出每个用户相邻两次浏览时间之差小于三分钟的次数。

预期结果:

解题思路:

(1). 子查询G 作为 left join 的主表,主要是为了获取所有的user_id

查询结果如下:

user_id   scan_time
1         2022-01-07 21:13:07
1         2022-01-07 21:15:25
1         2022-01-07 21:17:44
2         2022-01-13 21:14:09
2         2022-01-13 21:18:19
2         2022-01-13 21:20:36
3         2022-01-21 21:16:51
4         2022-01-02 21:17:22
4         2022-01-16 22:22:09
4         2022-01-30 15:15:44
4         2022-01-30 15:17:57

(2). 子查询H 作为 left join 的副表,主要是为了统计每个用户相邻两次浏览时间之差小于三分钟的总次数。

查询结果如下:

user_id     cnt
1           2
2           1
4           1

子查询H = 子查询C join 子查询D

(C=D, 使用C join D进行自关联,是为了处理:“相邻两次”和“浏览时间之差小于三分钟”的逻辑。)

子查询C,查询结果如下(与子查询D查询结果一致):

user_id   scan_time                rn
1         2022-01-07 21:13:07      1
1         2022-01-07 21:15:25      2
1         2022-01-07 21:17:44      3
2         2022-01-13 21:14:09      1
2         2022-01-13 21:18:19      2
2         2022-01-13 21:20:36      3
3         2022-01-21 21:16:51      1
4         2022-01-02 21:17:22      1
4         2022-01-16 22:22:09      2
4         2022-01-30 15:15:44      3
4         2022-01-30 15:17:57      4

子查询D,查询结果如下:

user_id   scan_time              rn 
1         2022-01-07 21:13:07     1
1         2022-01-07 21:15:25     2
1         2022-01-07 21:17:44     3
2         2022-01-13 21:14:09     1
2         2022-01-13 21:18:19     2
2         2022-01-13 21:20:36     3
3         2022-01-21 21:16:51     1
4         2022-01-02 21:17:22     1
4         2022-01-16 22:22:09     2
4         2022-01-30 15:15:44     3
4         2022-01-30 15:17:57     4

(3). 最后使用子查询G 的结果 left join 子查询H 的结果,查询结果如预期结果所示

使用 user_id 作为关联条件,并对 cnt 为 null 的数据进行 nvl 判断转换为0,最后使用 user_id 和 cnt 进行分组过滤重复数据

解题方式一:

适用于不用创建物理表的情况下

使用数据集I、A、E替代物理表:test_user_scan,直

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wu_Candy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值