马上要去字节入职了,今天分享一篇字节大数据开发的面经。入职之后看情况更新,不知道会不会很忙,忙的话更新频率可能低一点。
问题的答案写在这里了。可以先自己做再看答案。
字节跳动面经。

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');

答案:

uidfirst_visit_dtlast_visit_dt
1012021-07-072021-07-13
1022021-10-012021-10-06
1022021-10-112021-10-16
Reference

[1]力扣674. 最长连续递增序列:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/

欢迎关注。
在这里插入图片描述

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐