第28题 需求一: 搞笑类型视频的曝光点赞数据
1. 需求列表
需求方需要视频号搞笑类型视频的曝光点赞时长等数据,请提供一张 ads 表。搞笑类型视频定义:视频类型为搞笑或者视频创建者类型为搞笑
需要产出字段:视频 id,视频创建者 user_id,视频创建者名称、当天曝光次数、当天点赞次数、近 30 天曝光次数、近 30 天点赞次数
思路分析
第一步,我先从视频表和用户行为表中筛选出当天的搞笑类型视频的曝光点赞数据,按照视频 id 和视频创建者 user_id 分组求和,得到一个子表 a。
第二步,我再从视频创建者表中获取视频创建者名称,和子表 a 连接,得到一个子表 b。
第三步,我再从视频表和用户行为表中筛选出近 30 天的搞笑类型视频的曝光点赞数据,按照视频 id 分组求和,得到一个子表 c。
第四步,我把子表 b 和子表 c 连接,得到最终的 ads 表,并插入到分区为 20210718 的目标表中。
答案获取
建议你先动脑思考,动手写一写再对照看下答案,如果实在不懂可以点击下方卡片关注
, 回复:大厂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;