美团数据开发工程师暑期实习生招聘一面面经。同学们一定不要等准备好了再去面试。先投递简历进行面试,将面试中每次被问到的问题都记录下来并针对性学习,可以发现自己成长非常快。下面给出面试中遇到的问题。
介绍自己研究生阶段的研究方向,做过的项目,毕业时间,本科生阶段的情况,为什么想要投递这个岗位。
这个问题比较重要,可以反映一个人的工作能力,可以回答:
这个问题是用来考察一个人解决问题的能力,可以根据自己的项目提前准备,往自己熟悉的地方说。要包含下面的要素:
下面举几个例子:
以上只是举例。可以给自己每个项目准备一个问题。
太多了。单独写一篇来讲解。
推荐学习阿里的《大数据之路》。需要回答出的要点:
自己简历里提到了研究生阶段的一些研究性的问题,每个人不一样,这里不做回答。但是需要注意,只要写到了简历里面的东西,就必须要熟悉,即使和应聘的岗位没有关系,也要能有条理地讲出来,而且要做到:
前端埋点。建议看阿里的《大数据之路》这本书,讲得很详细。这里简单提一下:
开放性问题,能说多少说多少,往重要的地方说,往熟悉的地方说,引导面试官对自己熟悉的地方提问。
开放性问题。提前准备一些问题。比如版本兼容性问题,操作系统的问题。以后专门写一篇文章总结搭建大数据平台可能遇到的问题。
很可能问到 Flink 和 Spark Streaming 之间的区别。
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;
结果如下:
date | user_cnt | t1_cnt | t3_cnt | t7_cnt |
---|---|---|---|---|
2021-10-01 | 4 | 1 | 3 | 4 |
2021-10-02 | 1 | 1 | 1 | 1 |
2021-10-03 | 2 | 2 | 2 | 2 |
2021-10-04 | 2 | 1 | 2 | 2 |
2021-10-05 | 1 | 1 | 1 | 1 |
2021-10-06 | 2 | 2 | 2 | 2 |
2021-10-07 | 2 | 2 | 2 | 2 |
2021-10-08 | 1 | 1 | 1 | 1 |
中间表 table1 如下:
user_id | date |
---|---|
101 | 2021-10-01 |
102 | 2021-10-01 |
103 | 2021-10-01 |
104 | 2021-10-01 |
101 | 2021-10-02 |
101 | 2021-10-03 |
102 | 2021-10-03 |
101 | 2021-10-04 |
102 | 2021-10-04 |
103 | 2021-10-04 |
101 | 2021-10-05 |
101 | 2021-10-06 |
102 | 2021-10-06 |
101 | 2021-10-07 |
102 | 2021-10-07 |
104 | 2021-10-07 |
101 | 2021-10-08 |
104 | 2021-10-08 |
101 | 2021-10-09 |
中间表 table2 如下:
user_id | date1 | date2 |
---|---|---|
101 | 2021-10-01 | 2021-10-02 |
101 | 2021-10-01 | 2021-10-03 |
101 | 2021-10-01 | 2021-10-04 |
101 | 2021-10-01 | 2021-10-05 |
101 | 2021-10-01 | 2021-10-06 |
101 | 2021-10-01 | 2021-10-07 |
101 | 2021-10-01 | 2021-10-08 |
102 | 2021-10-01 | 2021-10-03 |
102 | 2021-10-01 | 2021-10-04 |
102 | 2021-10-01 | 2021-10-06 |
102 | 2021-10-01 | 2021-10-07 |
103 | 2021-10-01 | 2021-10-04 |
104 | 2021-10-01 | 2021-10-07 |
104 | 2021-10-01 | 2021-10-08 |
101 | 2021-10-02 | 2021-10-03 |
101 | 2021-10-02 | 2021-10-04 |
101 | 2021-10-02 | 2021-10-05 |
101 | 2021-10-02 | 2021-10-06 |
101 | 2021-10-02 | 2021-10-07 |
101 | 2021-10-02 | 2021-10-08 |
101 | 2021-10-02 | 2021-10-09 |
101 | 2021-10-03 | 2021-10-04 |
101 | 2021-10-03 | 2021-10-05 |
101 | 2021-10-03 | 2021-10-06 |
101 | 2021-10-03 | 2021-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`;