[TOC]

概述

数仓开发主要考核逻辑思维、业务理解和建模能力、数仓认知和方法论、编程基础(通过Python脚本、udf/udaf/udtf提高开发效率)和SQL(基本技能),优先考察业务理解和建模能力、数仓认知和方法论

  1. 评价沟通过程对人的感受,比如沟通顺利、聪明、其他等等之类的相关是否可以团队相处、潜力的评价
  2. 优势。比如基础好,把具体的面试的技术点明确来证明
  3. 劣势,不足,明确和你现在岗位的差距在哪里,为什么没有被录取。

业务理解和建模能力

数仓设计原则:以业务和需求为中心、以数据为驱动

考察3点:业务了解程度、数据了解程度、通过建模解决问题的能力

需要通过项目阐述、细节追问进行考察

  1. 项目背景、需求、目标、数据情况和数据质量概述
  2. 涉及的指标的定义是什么、定义是否合理、有何价值、如何改进

数仓认知和方法论

  1. 数仓的定义

    面向主题、集成的、稳定的、随时间变化的数据的集合,用于支持管理决策

    四大特征和一个目标

  2. 维度建模设计的步骤

    选择业务过程、声明粒度、确认维度、确认度量

  3. 事实表的分类

    原子事务事实表、无事实的事实表、累积快照事实表、周期快照事实表、聚集事实表、合并事实表

  4. 事实表中的度量分3种:可加、半可加、不可加,如何区分

    特定主题内的事实度量 是否覆盖全部维度
    可加
    半可加 部分覆盖
    不可加
  5. 维表和事实表如何随时间变化

    维表:一种是数据量的增加、一种是字段的变更;举用户为例,新注册用户为纵向增长、用户修改信息为横向增长

    事实表:一种是数据量的增加、一种是字段的变更;举订单为例,创建订单为纵向增长、订单状态流转为横向增长

    以上都需要不同的维表技术和事实表技术来处理

  6. 如何理解主题域和主题

    用树来描述事实表dwd+轻度汇总层dws的关系,描述面向主题是如何优化任务依赖和边界的

  7. 如何申明粒度

    粒度,回答的是“如何描述事实表中每行的内容”

    通过业务术语来表示粒度

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

  1. 总共5门课,其中3门课都旷课超过5次的学生
  2. 旷课最多的同学前3名
  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原理谈谈)

自由发挥