技术面一共三面,问题汇总
1 讲一下你门公司的大数据项目架构?
2 你在工作中都负责哪一部分
3 spark提交一个程序的整体执行流程
包括向yarn申请资源、DAG切割、TaskScheduler、执行task等过程
4 spark常用算子列几个,6到8个吧
5 transformation跟action算子的区别
6 map和flatmap算子的区别
7 自定义usf,udtf,udaf讲一下这几个函数的区别,编写的时候要继承什么类,实现什么方法
8 hive创建一个临时表有哪些方法(1 create table select 2 with select写法)
9 讲一下三范式,三范式解决了什么问题,有什么优缺点
10 讲一下纬度建模的过程 (选择业务过程 确定粒度 确定纬度 确定事实表)
11 纬度表有哪几种
12 事实表有几种
13 什么是纬度一致性,总线架构,事实一致性
15 什么是拉链表,如何实现?
16 什么是微型纬度、支架表,什么时候会用到
17 讲几个你工作中常用的spark 或者hive 的参数,以及这些参数做什么用的
18 工作中遇到数据倾斜处理过吗?是怎么处理的,针对你刚刚提的方案讲一下具体怎么实现。用代码实现,以及用sql实现。(此处没写代码,主要是讲清楚)
19 讲一下kafka对接flume 有几种方式。(我不会这道题……)
20 讲一下spark是如何将一个sql翻译成代码执行的,里面的原理介绍一下?(我也不会。。)
21 spark 程序里面的count distinct 具体是如何执行的
22 不想用spark的默认分区,怎么办?(自定义Partitioner 实现里面要求的方法 )具体是哪几个方法?(没写过)
23 有这样一个需求,统计一个用户的已经曝光了某一个页面,想追根溯是从哪几个页面过来的,然后求出在这几个来源所占的比例。你要怎么建模处理?(这里回答的不好,挺折磨的。面试官的意思是将所有埋点按时间顺序存在一个List 里,然后可能需要自定义udf函数,更主要的是考虑一些异常情况,比如点击流中间是断开的,或者点击流不全,怎么应对)
23 说一下你对元数据的理解,哪些数据算是元数据
24 有过数据治理的经验吗?(略懂)
25 说一下你门公司的数据是怎么分层处理的,每一层都解决了什么问题
26 讲一下星型模型和雪花模型的区别,以及应用场景
三面共三道笔试题,一面一道题
答题方式为网上答题,考官可实时看到敲代码的过程(类似屏幕共享)
用户登陆日志
app, user_id, datetime
a1,user1,2020-01-01 00:00:00
a2,user2,2020-01-01 00:00:01
a3,user3,2020-01-01 00:00:02
a4,user4,2020-01-01 00:00:03
……
输出每个app下访问次数最多的5个用户
答案:
select
app,
user_id
from
(select
app,
user_id,
row_numer() over(partition by app,user_id order by c desc) as rn
from
(select
app,
user_id,
count(*) as c
from
table0
group by
app,
user_id
)t0
)t0
where
rn<=5
现有城市网吧访问数据,字段:网吧id,访客id(身份证号),上线时间,下线时间
规则1、如果有两个用户在一家网吧的前后上下线时间在10分钟以内,则两人可能认识
规则2、如果这两个用户在三家以上网吧出现【规则1】的情况,则两人一定认识
需求:
该城市上网用户中两人一定认识的组合数
该题可以选用自己擅长的任何技术来解决,可以是JAVA、Python、C、C++编程语言,也可以是Hadoop,Spark大数据工具
答案:
设表名:table0
字段:wid , uid ,ontime ,offtime
select
id,
count(distinct wid) c
from
(select
wid,
concat(t0.uid,t1.uid) as id
from
(select
wid,
uid,
unix_timestamp(ontime,'yyyyMMdd HH:mm:ss') as ontime,
unix_timestamp(offtime,'yyyyMMdd HH:mm:ss') as offtime
from
table0
)t0
join
(select
wid,
uid,
unix_timestamp(ontime,'yyyyMMdd HH:mm:ss') as ontime,
unix_timestamp(offtime,'yyyyMMdd HH:mm:ss') as offtime
from
table0
)t1
on t0.wid=t1.wid
and t0.uid>t1.uid
and (abs(t0.ontime-t1.ontime)<10*60 or abs(t0.offtime-t1.offtime)<10*60)
)t0
group by
id
having
c>=3
存在的问题:大数据场景下事实表自连接运行缓慢,可能根本跑不动
现在有中国人从1980年到2020年每年每人的收入记录表A如下:
id,year,income
求每年收入前一万的人
需求拆解:
该题仍然是可采取任何一种技术来解决。
写java程序的话,可以用构建最大堆 + 一遍遍历,或者先分组局部聚合,再整体聚合。
使用sql解决的话,就是分组取topN,跟第一题很像
本人仍然是采用sql处理
第一版:
select
year,
id
from
(select
year,
id,
row_number() over(partition by year order by income desc) as rn
from
table0
)t0
where
rn=10000
存在的问题:每年数据会有13亿条,单个reduce处理压力很大。
第二版(先根据身份证号码前四位预分组,将13亿数据分成10万一组,每组取top10000,之后再一次分组):
select
year,
id
from
(select
year,
id,
row_number() over(partition by year order by income desc) as rn
from
(select
year,
id,
income,
row_number() over(partition by year,substr(id,1,4) order by income desc) as rn
from
table0
)t0
where
rn<=10000
)t0
where
rn<=10000