[TOC]
概述
数仓开发主要考核逻辑思维、业务理解和建模能力、数仓认知和方法论、编程基础(通过Python脚本、udf/udaf/udtf提高开发效率)和SQL(基本技能),优先考察业务理解和建模能力、数仓认知和方法论
- 评价沟通过程对人的感受,比如沟通顺利、聪明、其他等等之类的相关是否可以团队相处、潜力的评价
- 优势。比如基础好,把具体的面试的技术点明确来证明
- 劣势,不足,明确和你现在岗位的差距在哪里,为什么没有被录取。
业务理解和建模能力
数仓设计原则:以业务和需求为中心、以数据为驱动
考察3点:业务了解程度、数据了解程度、通过建模解决问题的能力
需要通过项目阐述、细节追问进行考察
- 项目背景、需求、目标、数据情况和数据质量概述
- 涉及的指标的定义是什么、定义是否合理、有何价值、如何改进
数仓认知和方法论
-
数仓的定义
面向主题、集成的、稳定的、随时间变化的数据的集合,用于支持管理决策
四大特征和一个目标
-
维度建模设计的步骤
选择业务过程、声明粒度、确认维度、确认度量
-
事实表的分类
原子事务事实表、无事实的事实表、累积快照事实表、周期快照事实表、聚集事实表、合并事实表
-
事实表中的度量分3种:可加、半可加、不可加,如何区分
特定主题内的事实度量 是否覆盖全部维度 可加 是 半可加 部分覆盖 不可加 否 -
维表和事实表如何随时间变化
维表:一种是数据量的增加、一种是字段的变更;举用户为例,新注册用户为纵向增长、用户修改信息为横向增长
事实表:一种是数据量的增加、一种是字段的变更;举订单为例,创建订单为纵向增长、订单状态流转为横向增长
以上都需要不同的维表技术和事实表技术来处理
-
如何理解主题域和主题
用树来描述事实表dwd+轻度汇总层dws的关系,描述面向主题是如何优化任务依赖和边界的
-
如何申明粒度
粒度,回答的是“如何描述事实表中每行的内容”
通过业务术语来表示粒度
SQL题
签到表:u_sign_t(uid,class,yyyyMMdd)
课程表:class_t(class comment ‘1-语文、2-数学、3-英语、4-物理、5-化学’,cnt comment ‘课时数’)
成绩表:u_class_t(uid,class,score)
成绩评定以平均分为准:A:90 ~ 100,B:80 ~ 90,C:70 ~ 80,D:60 ~ 70,E:0 ~ 60
- 总共5门课,其中3门课都旷课超过5次的学生
- 旷课最多的同学前3名
- 除了上面2类同学,计算其他学生的成绩分布
-- 先计算同学签到次数,课时数 - 签到次数 = 旷课次数
with u_classless_t as (
select c.class,u.uid,c.cnt,u.c_cnt from
(select class,cnt from class_t) c left join
(select uid,class,count(0) as c_cnt from u_sign_t group by uid,class) u on c.class = u.class
)
-- 筛选旷课5次的课程,按用户聚合并使用having语义实现筛选
u_classless_mostly as
(select uid from u_classless_t where cnt-c_cnt >= 5 group by uid having count(0) >= 3)
-- 排序函数 row_number/rank/dense_rank的区别要问出来
u_classless_rank as (
select uid from (
select uid,dense_rank() over(order by ds_cnt desc) as rank from (
select uid,sum(cnt-c_cnt) as ds_cnt from u_classless_t group by uid
) d
) t where rank <= 3
)
-- 如果对方用户avg来计算平均值 表示他们没考虑到缺考的情况
u_score as (
select t.uid,sum(score) / 5 as avg_score from u_class_t t
left join u_classless_mostly m on t.uid = m.uid
left join u_classless_rank r on t.uid = r.uid
where (m.uid is null or r.uid is null)
group by t.uid
)
select case when avg_score < 60 then 'E'
when avg_score >= 60 and avg_score < 70 then 'D'
when avg_score >= 70 and avg_score < 80 then 'C'
when avg_score >= 80 and avg_score < 90 then 'B'
when avg_score >= 90 and avg_score <= 100 then 'A' end as score_point,
count(0)
from u_score
group by case when avg_score < 60 then 'E'
when avg_score >= 60 and avg_score < 70 then 'D'
when avg_score >= 70 and avg_score < 80 then 'C'
when avg_score >= 80 and avg_score < 90 then 'B'
when avg_score >= 90 and avg_score <= 100 then 'A' end
编程基础
udf/udaf/udtf的区别 udf/udtf能实现哪些功能
udaf在hive中如何实现,各阶段的作用(需要结合MR原理谈谈)
自由发挥