Hive 查询用户连续三天登录的所有记录

目录

一、需求背景

二、建表与数据准备

三、实现步骤

[1. 获取每条记录后的第三天日期](#1. 获取每条记录后的第三天日期)

[2. 判断是否连续三天登录](#2. 判断是否连续三天登录)

[3. 筛选出每次连续三天的起始日期](#3. 筛选出每次连续三天的起始日期)

[4. 获取所有连续三天登录的日期记录](#4. 获取所有连续三天登录的日期记录)

语句说明

四、结果展示

五、总结


在用户行为数据分析中,常常需要分析用户的连续登录行为。本文将介绍如何使用 Hive SQL 查询出用户连续三天登录的记录。我们将通过一个示例表 user_log 来说明实现步骤,包括如何拆分数据、判断连续性、以及最终生成符合条件的完整结果。

一、需求背景

假设有一张用户登录记录表 user_log,记录了用户 ID 和登录日期,表结构如下:

  • id:用户 ID
  • dt:登录日期

数据样例如下:

id dt
1 2024-04-25
1 2024-04-26
1 2024-04-27
1 2024-04-28
1 2024-04-30
1 2024-05-01
1 2024-05-02
2 2024-05-02
2 2024-05-03
2 2024-05-04

目标是查询出所有用户连续三天登录的所有记录。

二、建表与数据准备

首先,在 Hive 中创建表并加载数据:

sql 复制代码
CREATE TABLE user_log (
  id INT,
  dt STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

LOAD DATA LOCAL INPATH '/home/hivedata/lianxu.txt' INTO TABLE user_log;

三、实现步骤

1. 获取每条记录后的第三天日期

首先,通过 LEAD() 函数获取每条记录的后两条记录的日期,得到"第三天的日期"(即 later3dt)。再计算实际第三天的日期 true3dt,用于后续判断是否是连续三天。

sql 复制代码
SELECT *,
       LEAD(dt, 2) OVER (PARTITION BY id ORDER BY dt) AS later3dt,
       DATE_ADD(dt, 2) AS true3dt
FROM user_log;

这样可以得到一个中间表,包含每条记录的实际第三天和该记录后的第三天日期。

2. 判断是否连续三天登录

later3dttrue3dt 进行对比,如果相等,则表示该条记录是连续三天登录的起始日期。

sql 复制代码
WITH t AS (
  SELECT *,
         LEAD(dt, 2) OVER (PARTITION BY id ORDER BY dt) AS later3dt,
         DATE_ADD(dt, 2) AS true3dt
  FROM user_log
)
SELECT *,
       IF(later3dt = true3dt, 1, 0) AS num
FROM t;

3. 筛选出每次连续三天的起始日期

在上一步中,我们对比了 later3dttrue3dt,如果相等则 num 值为 1。接下来,筛选出 num=1 的记录,这些记录表示连续三天登录的起始日期。

sql 复制代码
WITH t AS (
  SELECT *,
         LEAD(dt, 2) OVER (PARTITION BY id ORDER BY dt) AS later3dt,
         DATE_ADD(dt, 2) AS true3dt
  FROM user_log
),
t1 AS (
  SELECT *,
         IF(later3dt = true3dt, 1, 0) AS num
  FROM t
)
SELECT *
FROM t1
WHERE num = 1;

4. 获取所有连续三天登录的日期记录

通过和包含 0, 1, 2 的表进行笛卡尔积(即三天记录),获取每次连续三天登录的所有记录。

sql 复制代码
WITH t AS (
  SELECT *,
         LEAD(dt, 2) OVER (PARTITION BY id ORDER BY dt) AS later3dt,
         DATE_ADD(dt, 2) AS true3dt
  FROM user_log
),
t1 AS (
  SELECT *,
         IF(later3dt = true3dt, 1, 0) AS num
  FROM t
),
t2 AS (
  SELECT *
  FROM t1
  WHERE num = 1
)
SELECT id, dt, list, DATE_ADD(dt, d.list) AS dt2
FROM t2, (SELECT EXPLODE(ARRAY(0, 1, 2)) AS list) d;
语句说明
  • LEAD(dt, 2) OVER (PARTITION BY id ORDER BY dt) 用于获取每条记录后的第三条记录的日期。
  • DATE_ADD(dt, d.list) 通过 list 的笛卡尔积得到连续三天的每一天记录。

最终结果中,每位用户的连续三天登录的每一条记录将会被展示出来。

四、结果展示

执行上述 SQL 查询语句后,将得到以下结果:

id dt
1 2024-04-25
1 2024-04-26
1 2024-04-27
1 2024-04-26
1 2024-04-27
1 2024-04-28
1 2024-04-30
1 2024-05-01
1 2024-05-02
2 2024-05-02
2 2024-05-03
2 2024-05-04

五、总结

本文介绍了如何使用 Hive 查询用户连续三天登录的所有记录。通过 LEAD 函数和笛卡尔积操作,我们可以轻松查询出符合条件的记录。这种方法适合处理连续登录的情况,能够帮助我们对用户行为数据进行更深入的分析。

相关推荐
SelectDB技术团队17 小时前
上市大模型企业数据基础设施的选择:MiniMax 基于阿里云 SelectDB 版,打造全球统一AI可观测中台
数据库·数据仓库·人工智能·ai·apache
weixin_4624462317 小时前
Hive Metastore 使用 MySQL 8(CJ 驱动)完整配置实战(含完整 Shell 脚本)
hive·hadoop·mysql
zgl_2005377918 小时前
源代码:ZGLanguage 解析SQL数据血缘 之 显示 MERGE SQL 结构图
数据库·数据仓库·hive·数据治理·etl·sql解析·数据血缘
Gain_chance18 小时前
24-学习笔记尚硅谷数仓搭建-DIM层的维度表建表思路及商品表维度表的具体建表解析
数据仓库·hive·笔记·学习·datagrip
编程小风筝19 小时前
MySQL数据库如何实现实现数据仓库存储?
数据库·数据仓库·mysql
talle202119 小时前
Hive | 分区与分桶
大数据·数据仓库·hive
zhangkaixuan4561 天前
Paimon 读取数据流程深度解析
大数据·hadoop·flink·apache·paimon
Gain_chance1 天前
23-学习笔记尚硅谷数仓搭建-ODS层业务全量表、增量表结构设计及数据装载脚本
数据仓库·hive·笔记·学习
JZC_xiaozhong1 天前
什么是ETL?一文了解提取、转换与加载
数据库·数据仓库·数据分析·etl·数据一致性·数据孤岛解决方案·数据集成与应用集成
yumgpkpm2 天前
在AI语言大模型时代 Cloudera CDP(华为CMP 鲲鹏版)对自有知识的保护
人工智能·hadoop·华为·zookeeper·spark·kafka