irpas技术客

【面经】数据开发一面-美团暑期实习_美团 数仓实习生_和风与影

未知 8209

??美团数据开发工程师暑期实习生招聘一面面经。同学们一定不要等准备好了再去面试。先投递简历进行面试,将面试中每次被问到的问题都记录下来并针对性学习,可以发现自己成长非常快。下面给出面试中遇到的问题。

自我介绍

介绍自己研究生阶段的研究方向,做过的项目,毕业时间,本科生阶段的情况,为什么想要投递这个岗位。

从项目中学到了什么?

这个问题比较重要,可以反映一个人的工作能力,可以回答:

解决问题的流程:先调研问题背景,查找已有的解决方案,针对需要解决的问题进行改进,制定出整体的框架,最后实施并测试效果。技术栈:比如熟悉了大数据领域的技术栈,熟悉了建模的流程。沟通:需要和多方进行对接,沟通十分重要,搞清楚需求是什么,我们需要拿到什么数据,下一步要做什么。合作:一个人不可能每个方面都精通,需要多方合作。工作态度:认真仔细,少出 bug。思考:独立思考的能力。总结:介绍之后对项目的执行进行复盘。 项目中遇到的最大的问题是什么?怎么解决的?

这个问题是用来考察一个人解决问题的能力,可以根据自己的项目提前准备,往自己熟悉的地方说。要包含下面的要素:

遇到的问题是什么,问题有什么表现。如何找到问题的发生的原因。如何解决。

下面举几个例子:

项目中数据并不多,但是 Hadoop 的 NameNode 内存被占用了很多,并且 MR 计算启动了很多 MapTask,每个 MapTask 处理的数据量却很小,MapTask 的处理时间比启动时间还小,白白浪费资源。通过这些表现定位到是小文件过多,于是采用了小文件的解决方法,具体方法如下: 数据采集时就将小文件合并成大文件再上传到 HDFS。业务处理前在 HDFS 上使用 MapReduce 程序对小文件进行合并。MapReduce 处理时采用 CombineTextInputFormat。开启 JVM 重用。采用 Hadoop Archive 将多个小文件打包成 HAR 文件。 MapReduce 计算过程中,发现某些 reducer 的资源消耗远大于其他 reducer。这种情况就是发生了数据倾斜。项目中发生数据倾斜的原因是有很多空值。此时可以将表 a 中 key 为空的字段赋予一个随机值,使得数据均匀地分布到不同的 reducer 上。Flink 计算过程中通过 Flink Web UI(localhost:8081) 监控发现发生了背压报警,数据流的速度过快,下游的算子来不及消费。通过调试发现是 watermark 的最大延迟时间设置过大。将它设置小一些,把迟到的元素发送到侧输出流中晚一点更新结果。

以上只是举例。可以给自己每个项目准备一个问题。

数据倾斜怎么解决?

太多了。单独写一篇来讲解。

你对数仓分层有什么理解?

推荐学习阿里的《大数据之路》。需要回答出的要点:

为什么要分层: 复杂问题简单化,每层只处理简单的问题,方便问题定位减少重复开发,增加每次结果的复用性隔离原始数据,真实数据与统计数据解耦 分哪些层: ODS(Operation Data Store):原始数据,保持原貌不做修改DWD(Data Warehouse Detail):明细数据,对 ODS 进行清洗,保存业务事实明细,一行是一次业务行为DWS(Data Warehouse Summary):汇总数据,例如按天进行轻度汇总ADS(Application Data Store):统计报表 说一下(**)算法?有哪些?怎么用?

自己简历里提到了研究生阶段的一些研究性的问题,每个人不一样,这里不做回答。但是需要注意,只要写到了简历里面的东西,就必须要熟悉,即使和应聘的岗位没有关系,也要能有条理地讲出来,而且要做到:

通俗:面试官没有研究过这一领域,需要用通俗的、易理解的方式讲解,让他能够理解。背景:先讲背景,不然很抽象。即要解决什么问题。常用的解决方法。自己的解决方法。应用场景。最后复盘,学到了什么。 数仓的数据从哪来? 业务数据:MySQL数据库。用户行为日志:前端埋点的日志数据。 用户行为数据怎么来的?

前端埋点。建议看阿里的《大数据之路》这本书,讲得很详细。这里简单提一下:

日志分类:浏览日志-PV、UV的统计基础,页面交换日志-用户的操作行为。采集的过程:这里涉及到 HTTP 协议。清洗:识别流量攻击、流量作弊、缺失数据补正、无效数据剔除、日志隔离分发。 埋点要记录些什么字段? 公共信息:地区、手机品牌、操作系统、设备 id、会员 id、app 版本号 等等动作:动作 id、目标 id、目标类型(例如 SKU_id)、动作时间戳 等等曝光:曝光类型、曝光对象 id、出现顺序、曝光位置 等等页面信息:持续时间、页面 id、来源类型 等等错误:错误码、错误信息 spark了解吗?

开放性问题,能说多少说多少,往重要的地方说,往熟悉的地方说,引导面试官对自己熟悉的地方提问。

大数据平台是不是自己搭的?有什么问题?

开放性问题。提前准备一些问题。比如版本兼容性问题,操作系统的问题。以后专门写一篇文章总结搭建大数据平台可能遇到的问题。

实时计算了解吗?

很可能问到 Flink 和 Spark Streaming 之间的区别。

SQL 题

input table1: user_id,order_time(2022-02-25 18:30:00 )

问题1:求每天的下单总人数,t 日下单的人中,下单后 1 天又下单的人数 t+1,下单后 1-3 天中又下单的人数 t+3,下单后 1-7 天又下单的人数 t+7

output: date, user_cnt, t1_cnt, t3_cnt, t7_cnt

解法如下:

with table1 as( # 去重,一个用户可能一天下了多单 select distinct user_id,date(order_time) `date` from tb_order ), table2 as( select user_id,t1.date date1,t2.date date2 from table1 t1 join table1 t2 using(user_id) where datediff(t2.date,t1.date) between 1 and 7 ) select date1 `date`, count(distinct user_id) user_cnt, count(distinct(case when datediff(date2,date1)=1 then user_id else null end)) 't1_cnt', count(distinct(case when datediff(date2,date1) between 1 and 3 then user_id else null end)) 't3_cnt', count(distinct(case when datediff(date2,date1) between 1 and 7 then user_id else null end)) 't7_cnt' from table2 group by date1;

结果如下:

dateuser_cntt1_cntt3_cntt7_cnt2021-10-0141342021-10-0211112021-10-0322222021-10-0421222021-10-0511112021-10-0622222021-10-0722222021-10-081111

中间表 table1 如下:

user_iddate1012021-10-011022021-10-011032021-10-011042021-10-011012021-10-021012021-10-031022021-10-031012021-10-041022021-10-041032021-10-041012021-10-051012021-10-061022021-10-061012021-10-071022021-10-071042021-10-071012021-10-081042021-10-081012021-10-09

中间表 table2 如下:

user_iddate1date21012021-10-012021-10-021012021-10-012021-10-031012021-10-012021-10-041012021-10-012021-10-051012021-10-012021-10-061012021-10-012021-10-071012021-10-012021-10-081022021-10-012021-10-031022021-10-012021-10-041022021-10-012021-10-061022021-10-012021-10-071032021-10-012021-10-041042021-10-012021-10-071042021-10-012021-10-081012021-10-022021-10-031012021-10-022021-10-041012021-10-022021-10-051012021-10-022021-10-061012021-10-022021-10-071012021-10-022021-10-081012021-10-022021-10-091012021-10-032021-10-041012021-10-032021-10-051012021-10-032021-10-061012021-10-032021-10-07

建表语句:

DROP TABLE IF EXISTS tb_order; CREATE TABLE tb_order( user_id INT NOT NULL COMMENT '用户ID', order_time datetime COMMENT '下单时间' ) CHARACTER SET utf8 COLLATE utf8_bin; INSERT INTO tb_order(user_id, order_time) VALUES (101, '2021-10-01 10:00:00'), (101, '2021-10-01 12:00:00'), (102, '2021-10-01 10:00:00'), (103, '2021-10-01 10:00:00'), (104, '2021-10-01 10:00:00'), (101, '2021-10-02 10:00:00'), (101, '2021-10-03 10:00:00'), (102, '2021-10-03 10:00:00'), (101, '2021-10-04 10:00:00'), (102, '2021-10-04 10:00:00'), (103, '2021-10-04 10:00:00'), (101, '2021-10-05 10:00:00'), (101, '2021-10-06 10:00:00'), (102, '2021-10-06 10:00:00'), (101, '2021-10-07 10:00:00'), (102, '2021-10-07 10:00:00'), (104, '2021-10-07 10:00:00'), (101, '2021-10-08 10:00:00'), (104, '2021-10-08 10:00:00'), (101, '2021-10-09 10:00:00');

问题2:还是上面的表,得到每天的新用户

select date(min(order_time)) `date`,user_id from tb_order group by user_id;

问题3:还是上面的表,统计当天下单了,前一天没下单的用户

with t1 as( # 去重,一个人可能一天下单多次 select distinct date(order_time) `date`, user_id from tb_order ), t2 as( # 找出上一次下单日期 select `date`, user_id, lag(`date`) over(partition by user_id order by `date`) pre_date from t1 ) select # 上一次下单日期为空或者上一次下单日期与今天相差大于 1 天的就是答案 `date`, user_id from t2 where pre_date is null or datediff(`date`,pre_date)>1 order by `date`;

欢迎关注公众号。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #美团 #数仓实习生 #下面给出面试中遇到的问题