每天一道大厂SQL题【Day29】腾讯数据提取(二)过去一周内的曝光点赞数据

2023-10-13 11:56:42 浏览数 (2)

每天一道大厂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

娱乐、新闻、搞笑

代码语言:javascript复制
-- 建表
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;

0 人点赞