目录
[1. 获取每条记录后的第三天日期](#1. 获取每条记录后的第三天日期)
[2. 判断是否连续三天登录](#2. 判断是否连续三天登录)
[3. 筛选出每次连续三天的起始日期](#3. 筛选出每次连续三天的起始日期)
[4. 获取所有连续三天登录的日期记录](#4. 获取所有连续三天登录的日期记录)
在用户行为数据分析中,常常需要分析用户的连续登录行为。本文将介绍如何使用 Hive SQL 查询出用户连续三天登录的记录。我们将通过一个示例表 user_log
来说明实现步骤,包括如何拆分数据、判断连续性、以及最终生成符合条件的完整结果。
一、需求背景
假设有一张用户登录记录表 user_log
,记录了用户 ID 和登录日期,表结构如下:
id
:用户 IDdt
:登录日期
数据样例如下:
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. 判断是否连续三天登录
将 later3dt
和 true3dt
进行对比,如果相等,则表示该条记录是连续三天登录的起始日期。
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. 筛选出每次连续三天的起始日期
在上一步中,我们对比了 later3dt
和 true3dt
,如果相等则 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
函数和笛卡尔积操作,我们可以轻松查询出符合条件的记录。这种方法适合处理连续登录的情况,能够帮助我们对用户行为数据进行更深入的分析。