每天一道大厂SQL题【Day29】腾讯数据提取(二)过去一周内的曝光点赞数据
大家好,我是Maynor。相信大家和我一样,都有一个大厂梦
,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题
,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。
一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!
第29题 需求二: 过去一周内的曝光点赞数据
1. 需求列表
需要输出一张中间 dws 层表:要求能够查询每个视频创建者 user_id 最近发布的 3 个视频,在过去一周内的曝光,点赞数据
需要产出字段:视频创建者 user_id,曝光用户,点赞用户数,曝光次数、点赞次数
思路分析
首先使用WITH
子句定义了三个临时表:
recent_videos
:查询过去一周内发布的所有视频,并使用ROW_NUMBER()
函数为每个视频创建者的视频分配一个行号,按照视频创建时间降序排列。top_3_videos
:从recent_videos
表中选择行号小于等于3的视频,即每个视频创建者最近发布的3个视频。video_action
:将top_3_videos
表与t_user_video_action_d
表连接,以获取每个视频创建者最近发布的3个视频在过去一周内的曝光和点赞数据。使用聚合函数计算曝光用户数,点赞用户数,曝光次数和点赞次数。
最后,从video_action
表中选择所需字段即可。
答案获取
建议你先动脑思考,动手写一写再对照看下答案,如果实在不懂可以点击下方卡片,回复:大厂sql
即可。
参考答案适用HQL,SparkSQL,FlinkSQL,即大数据组件,其他SQL需自行修改。
加技术群讨论
点击下方卡片关注 联系我进群
或者直接私信我进群
附表
用户行为表:t_user_video_action_d分区:ds(格式 yyyyMMdd) 主键:user_id、video_id
含义:一个 user 对一个视频的所有行为聚合,每天增量字段:
字段名 | 字段含义 | 类型 |
---|---|---|
user_id | 用 户 id | string |
video_id | 视 频 id | string |
expose_cnt | 曝光次数 | int |
like_cnt | 点赞次数 | int |
视频表:t_video_d
分区:ds(格式 yyyyMMdd)主键:video_id
含义:当天全量视频数据字段:
字段名 | 字段含义 | 类型 | 枚举 |
---|---|---|---|
video_id | 视 频 id | string | |
video_type | 视频类型 | string | 娱乐、新闻、搞笑 |
video_user_id | 视频创建者 user_id | string | |
video_create_time | 视频创建时间 | bigint |
作者表:t_video_user_d
分区:ds(格式 yyyyMMdd)主键:video_user_id
含义:当天全量视频创建者数据
字段名 | 字段含义 | 类型 | 枚举 |
---|---|---|---|
video_user_id | 视频创建者 user_id | string | |
video_user_name | 名称 | string | |
video_user_type | 视频创建者类型 | string | 娱乐、新闻、搞笑 |
-- 建表
create table if not exists t_user_video_action_d (
user_id string comment "用户id", video_id string comment "视频id", expose_cnt int comment "曝光次数", like_cnt int comment "点赞次数"
)
partitioned by (ds string);
create table if not exists t_video_d (
video_id string comment ' 视 频 id', video_type string comment ' 视 频 类 型 ', video_user_id string comment '视频创建者user_id', video_create_time bigint comment '视频创建时间'
)
partitioned by (ds string);
create table if not exists t_video_user_d (
video_user_id string comment '视频创建者user_id', video_user_name string comment ' 名 称 ', video_user_type string comment '视频创建者类型'
)
partitioned by (ds string);
文末SQL小技巧
提高SQL功底的思路。 1、造数据。因为有数据支撑,会方便我们根据数据结果去不断调整SQL的写法。 造数据语法既可以create table再insert into,也可以用下面的create temporary view xx as values语句,更简单。 其中create temporary view xx as values语句,SparkSQL语法支持,hive不支持。 2、先将结果表画出来,包括结果字段名有哪些,数据量也画几条。这是分析他要什么。 从源表到结果表,一路可能要走多个步骤,其实就是可能需要多个子查询,过程多就用with as来重构提高可读性。 3、要由简单过度到复杂,不要一下子就写一个很复杂的。 先写简单的select from table…,每个中间步骤都执行打印结果,看是否符合预期, 根据中间结果,进一步调整修饰SQL语句,再执行,直到接近结果表。 4、数据量要小,工具要快,如果用hive,就设置set hive.exec.mode.local.auto=true;如果是SparkSQL,就设置合适的shuffle并行度,set spark.sql.shuffle.partitions=4;