【社招】快手_数据仓库_面试题整理

1、面试

技术面一共三面,问题汇总

1 讲一下你门公司的大数据项目架构?

  • 实时流和离线计算两条线
  • 数仓输入(客户端日志,服务端日志,数据库)
  • 传输过程(flume,kafka)
  • 数仓输出(报表,画像,推荐等)

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 讲一下星型模型和雪花模型的区别,以及应用场景

2、笔试

三面共三道笔试题,一面一道题
答题方式为网上答题,考官可实时看到敲代码的过程(类似屏幕共享)

题1:

用户登陆日志
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

题2:

现有城市网吧访问数据,字段:网吧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
	

存在的问题:大数据场景下事实表自连接运行缓慢,可能根本跑不动

题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

你可能感兴趣的:(面试题整理)