【面经】字节跳动大数据开发面经
马上要去字节入职了,今天分享一篇字节大数据开发的面经。入职之后看情况更新,不知道会不会很忙,忙的话更新频率可能低一点。问题的答案写在这里了。可以先自己做再看答案。字节跳动面经。1.自我介绍2.数仓是什么?可以看《大数据之路》。3.Hive 是什么?建议看官网的描述。4.讲一下 MapReduce 的过程常考题,必会。这里简单说一下,后面单独写一篇文章。5.比较 MR 和 Spark 的 Shu
马上要去字节入职了,今天分享一篇字节大数据开发的面经。入职之后看情况更新,不知道会不会很忙,忙的话更新频率可能低一点。
问题的答案写在这里了。可以先自己做再看答案。
字节跳动面经。
1.自我介绍
2.数仓是什么?
可以看《大数据之路》。
3.Hive 是什么?
建议看官网的描述。
4.讲一下 MapReduce 的过程
常考题,必会。这里简单说一下,后面单独写一篇文章。
5.比较 MR 和 Spark 的 Shuffle的过程?
常考题,必会。这里简单说一下,后面单独写一篇文章。
6.Hive 中 Group by 的底层原理讲一下
常考题,必会,很重要,理解这个过程才能知道为什么会产生数据倾斜,怎么处理数据倾斜。后面单独写一篇文章。
7.Hive 中 join 的底层原理讲一下
后面单独写一篇。这里简单说一下。
7.1 Common join
这种 join 包含 map、shuffle、reduce 三个步骤。
7.2 Map join
8.Hadoop 和 Spark 的区别
9.MR 为什么慢
有对比才有快慢。一般是和 Spark 对比。后面单独写一篇文章。
10.Flume 用来干什么的?
11.Flume 的架构?
12.分层建模怎么分层?
建议看阿里的《大数据之路》。
13.算法:674. 最长连续递增序列[1]
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], …, nums[r - 1], nums[r]] 就是连续递增子序列。
示例 1:
输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。
示例 2:
输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。
动态规划:
class Solution {
public int findLengthOfLCIS(int[] nums) {
int n = nums.length;
if(n == 0) return 0;
int ans = 1;
int pre = 1, cur;
for(int i = 1; i < n; i++){
if(nums[i] > nums[i - 1]) cur = pre + 1;
else cur = 1;
ans = Math.max(ans, cur);
pre = cur;
}
return ans;
}
}
14.SQL
input table1:shop_id,sale_dt(2022-02-22 18:20:15),sale_vol
求每天,每个商家,总销量
select
date(sale_dt) dt,
shop_id,
sum(sale_vol) sale_vol
from table1
group by dt,shop_id;
15.SQL
input table2: uid,in_time(2022-02-25 18:30:00)
求取用户最大连续访问天数
output: uid,first_visit_dt,last_visit_dt
连续最大访问天数是常考题,专门写过一篇问题。
不过这道题是求开始和结束日期。
with t1 as( # t1 去重,一个人一天可能登录多次
select
distinct date(in_time) in_dt,
uid
from tb_user_log
),
t2 as( # t2 对每个人的登录日期排序 rn
select
in_dt,
uid,
row_number() over(partition by uid order by in_dt) rn
from t1
),
t3 as( # t3 用登录日期减去排序 rn 得到 group_dt
select
in_dt,
uid,
date_sub(in_dt,interval rn day) group_dt,
rn
from t2
),
t4 as( # t4 求得连续登录天数 days
select
uid,
group_dt,
count(1) days,
min(rn) rn
from t3
group by uid,group_dt
),
t5 as( # t5 筛选出每个人最大的连续登录天数
select
t4.uid,
group_dt,
days,
rn
from t4 join (
select
uid,
max(days) md
from t4
group by uid) tt
on t4.uid=tt.uid and t4.days=tt.md
)
select # 得到答案
uid,
date_add(group_dt,interval rn day) first_visit_dt,
date_add(group_dt,interval rn+days-1 day) last_visit_dt
from t5;
# 建表
DROP TABLE IF EXISTS tb_user_log;
CREATE TABLE tb_user_log (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
uid INT NOT NULL COMMENT '用户ID',
in_time datetime COMMENT '进入时间'
) CHARACTER SET utf8 COLLATE utf8_bin;
INSERT INTO tb_user_log(uid, in_time) VALUES
(101, '2021-07-07 10:00:00'),
(101, '2021-07-08 10:00:00'),
(101, '2021-07-09 10:00:00'),
(101, '2021-07-10 10:00:00'),
(101, '2021-07-11 10:00:00'),
(101, '2021-07-12 10:00:00'),
(101, '2021-07-13 10:00:00'),
(102, '2021-10-01 10:00:00'),
(102, '2021-10-02 10:00:00'),
(102, '2021-10-03 10:00:00'),
(102, '2021-10-04 10:00:00'),
(102, '2021-10-05 10:00:00'),
(102, '2021-10-06 10:00:00'),
(102, '2021-10-11 10:00:00'),
(102, '2021-10-12 10:00:00'),
(102, '2021-10-13 10:00:00'),
(102, '2021-10-14 10:00:00'),
(102, '2021-10-15 10:00:00'),
(102, '2021-10-16 10:00:00');
答案:
uid | first_visit_dt | last_visit_dt |
---|---|---|
101 | 2021-07-07 | 2021-07-13 |
102 | 2021-10-01 | 2021-10-06 |
102 | 2021-10-11 | 2021-10-16 |
Reference
[1]力扣674. 最长连续递增序列:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
欢迎关注。
更多推荐
所有评论(0)