题目一:计算平台的每一个用户发过多少朋友圈、获得多少点赞
已知,数据如下:
T1:10万行数据
uid(用户id) | log_id(日记id) |
uid1 | log_id1 |
uid1 | log_id2 |
uid2 | log_id3 |
… | … |
T2:1000万行数据(注:没有被点赞的日记此表不做记录)
log_id(日记id) | like_uid(点赞的用户id) |
log_id1 | uid2 |
log_id1 | uid3 |
log_id1 | uid4 |
log_id3 | uid2 |
… | … |
需求:请用sql计算出如下结果:
uid(用户id) | 发过多少日记 | 获得多少点赞 |
uid1 | 2 | 3 |
uid2 | 1 | 1 |
… | … | … |
题目二:处理产品版本号
版本号信息存储在数据表中,每行一个版本号。
版本号命名规则符合正则表达式:(?:[1-9]\d|[1-9])(.(?:[1-9]\d|\d)){1,2}
补充说明:
产品版本号由三个部分组成
如:9.11.2
第一部分9为主版本号,为1-99之间的数字;
第二部分11为子版本号,为0-99之间的数字;
第三部分2为阶段版本号,为0-99之间的数字(可选);
请根据具体条件和问题,使用hive sql编程:
1.条件:T1表有100个版本号,找出其中最大的版本号。
举例:
T1:
v_id (版本号) |
9.9.2 |
8.1 |
9.9.2 |
9.20 |
31.0.1 |
… |
2.条件:T1表有1000万个版本号,给如下格式的所有版本号排序。对于相同的版本号,顺序号一致。
table_result (排序结果表) :
v_id (版本号) | seq (顺序号) |
31.0.1 | 0 |
9.20 | 1 |
9.9.2 | 2 |
9.9.2 | 2 |
9.0.8 | 4 |
… | … |
题目三、计算用户留存
用户留存是体现平台健康程度的重要数据指标之一,请用hive sql完成如下需求:
已知:
用户信息表结构:
CREATE TABLE if NOT EXISTS tb_user (
user_id BIGINT COMMENT "用户id",
create_time STRING COMMENT "注册时间,如:2019-01-01 08:00:00"
)
COMMENT "用户信息表";
访问日志表结构
CREATE TABLE if NOT EXISTS tb_access_log (
user_id BIGINT COMMENT "用户id",
page_url STRING COMMENT "网站页面路径,用于标记不同页面",
create_time STRING COMMENT "访问时间,如:2019-01-01 08:00:01"
)
COMMENT "用户访问日志表"
PARTITIONED by (dt STRING COMMENT "格式:yyyymmdd ,数值与create_time转化后的日期一致";
tb_user : 总量大约200万行
user_id | create_time |
123456 | 2018-09-01 08:00:01 |
123457 | 2019-05-24 09:21:42 |
123458 | 2019-08-04 21:02:12 |
… | … |
tb_access_log :每天新增访问记录约8000万行
user_id | page_url | create_time | dt |
123456 | index | 2018-09-01 08:08:32 | 20180901 |
123457 | hot | 2019-05-24 09:21:46 | 20190524 |
123458 | mine | 2019-08-04 22:01:21 | 20190804 |
… | … | … | … |
定义:
- 新用户:某一日新注册的用户
- 新用户次1日留存:T日成为新用户,T+1日回访平台网站任意页面(T+1即T日期的第二天)
- 新用户次3日留存:T日成为新用户,T+3日回访平台网站任意页面
- 新用户次n日留存:T日成为新用户,T+n日回访平台网站任意页面
1.假设平台元旦节做了一次拉新活动,当日新增用户数约为平日的两倍,2019年1月9日,距离活动已经过去一周了**,公司希望评估一下2019年1月1日当天的全部新增用户,在接下来一周的留存情况****(即1月2日-1月8日每天的留存用户数),要求交付的数据结果表如下,请用一个简洁的sql****计算出如下数据: **
新用户数 | 次1日留存用户数 | 次2日留存用户数 | 次3日留存用户数 | 次4日留存用户数 | 次5日留存用户数 | 次6日留存用户数 | 次7日留存用户数 | dt(成为新用户日期) |
61132 | 5054 | 4284 | 3492 | 3209 | 3202 | 2929 | 2116 | 20190101 |
2.本次活动拉新留存情况符合预期,公司决定后续会不定期举办拉新活动,以获得更多新用户,如何设计调度任务,使得报表按天增量更新如下,帮助公司长期监控平台新用户的留存,希望保留全量历史数据,方便随时对比各期活动情况?(请给出完整的相关sql,包括建表语句,写入数据过程等)
(以下数据范例最近更新日期为:20190109)
表名:reporting_new_user_retain_day
新用户数 | 次1日留存用户数 | 次2日留存用户数 | 次3日留存用户数 | 次4日留存用户数 | 次5日留存用户数 | 次6日留存用户数 | 次7日留存用户数 | dt(成为新用户日期,格式yyyymmdd) |
33492 | null | null | null | null | null | null | null | 20190108 |
33679 | 3452 | null | null | null | null | null | null | 20190107 |
34657 | 3253 | 2662 | null | null | null | null | null | 20190106 |
35264 | 3582 | 2865 | 1627 | null | null | null | null | 20190105 |
33266 | 3281 | 2660 | 1619 | 1387 | null | null | null | 20190104 |
37125 | 3620 | 2761 | 1897 | 1578 | 1372 | null | null | 20190103 |
31206 | 3121 | 2465 | 1597 | 1078 | 995 | 991 | null | 20190102 |
61132 | 5054 | 4284 | 3492 | 3209 | 3202 | 2929 | 2816 | 20190101 |
30206 | 3021 | 2165 | 1397 | 971 | 895 | 873 | 867 | 20181231 |
… | … | … | … | … | … | … | … | … |
温馨提示:答题结果建议保存为sql文件或者pdf格式,避免代码排版错乱等问题,谢谢!
SELECT DATE_FORMAT(t1.create_time, "yyyy-MM-dd"),
count(t1.user_id),
COUNT(CASE
WHEN DATEDIFF(DATE_FORMAT(t1.create_time, "yyyy-MM-dd"), t2.create_time) = 1 THEN t1.USER_id
END) ,
COUNT(CASE
WHEN DATEDIFF(DATE_FORMAT(t1.create_time, "yyyy-MM-dd"), t2.create_time) = 2 THEN t1.USER_id
END),
COUNT(CASE
WHEN DATEDIFF(DATE_FORMAT(t1.create_time, "yyyy-MM-dd"), t2.create_time) = 3 THEN t1.USER_id
END),
COUNT(CASE
WHEN DATEDIFF(DATE_FORMAT(t1.create_time, "yyyy-MM-dd"), t2.create_time) = 4 THEN t1.USER_id
END)
FROM tb_user t1
LEFT JOIN (
SELECT user_id,
DATE_FORMAT(create_time, "yyyy-MM-dd") AS create_time
FROM tb_access_log
GROUP BY user_id,
DATE_FORMAT(create_time, "yyyy-MM-dd") ) t2 ON t1.user_id = t2.user_id
GROUP BY DATE_FORMAT(t1.create_time, "yyyy-MM-dd")
考虑到数据量大的问题,只算近七天的数据,之前的数据算完之后保存为历史,近7天增量更新