META data engineer product analytics 面经

Viewed 119

面试半小时前刚结束但估计要凉先写下来回报社会。

额外一个hint:我本来以为meta会用zoom的whiteboard或者很fancy的screensharing去detect AI assistant 找了半天undetectable的AI coder没一个能正常在zoom下好好work的。但据我这次体验他就是个leetcode一样的东西,不会真的看有没有screensharing啥的。用PC的话打开自带的copilot小眼镜模式(screensharing),让他完全静音,面试前跟他说好要什么答案和解题思路,根本不需要自己在那傻写。胆子大的先享受世界好吧,我路给大家探好了反正虽然我就是那个勤恳debug的大傻子嘿嘿。

总共50min coding,25分钟3道算法,25分钟3道SQL

算法1:
find the comment with the most occuration across all locations
input:
{location1:["xya","abx", "xya"]
location2:["abc","abx"],
location3:["xya"]}
output:
"abx" or "xya" cause they both appeared twice, anyone of them is fine.
hint: "xya" in location1 is count as one time as duplicate comments should be ignored.

我写的loop一遍存成counter再binary search 那个counter里的value

算法2:
find the minimal odd numbers that can be made from the input
input:29031
output:139
input:2020
output:None
input:9999993333311
output:1133333999999

我写的input变list of str如果d%2==1,sort 完用join然后换回int

算法3:
(只剩1分钟算法连看题都没太来得及)什么bookstore event consecutive 2 years啥的。。。找到什么most啥啥啥 反正就return一个bookstore。我瞎跟面试官聊了一下思路就开始写sql题了。

============
SQL 都用的是书,交易,作者, ?(忘了因为完全没用到)四个dimension tables
SQL1:
找total sales 和total distinct customer from transactions table那种,基础题

SQL2:
找头5个customer他们referred的customer 买书avg payment最多。 用CTE 先找total payment from transaction tables(有个小陷阱per transaction can have more than 1 book, for avg we need to sum book_count), 然后return referred_by_customer_id order by avg_pay limit 5.

SQL3:
return一行数据,total author,percentage 的作者没有任何书(没有author_id在book table里),percentage的作者没有任何sales(transactions table里只有book ID 没有author id所以还得join回去).

1 Answers

attach一下AI 优化过 帖子增加可读性(dbq我本人懒得把我的想法重新写好了):

Meta 数据工程师面试经验 – 编程 + SQL 题目
刚刚结束了面试,大概半个小时前,为了回馈社区,我记录一下整个过程。本次面试共 50 分钟,其中 25 分钟进行算法题,25 分钟进行 SQL 题。

算法题

  1. 找出所有地点中出现次数最多的评论
    问题描述:
    给定一个包含不同地点评论的字典,每个地点都有一个评论列表,找出在所有地点中出现频率最高的评论。
    输入:
    {
    "location1": ["xya", "abx", "xya"],
    "location2": ["abc", "abx"],
    "location3": ["xya"]
    }

输出: "abx" 或 "xya"(它们都出现了两次,返回其中任意一个都可以)
关键点:
在同一个地点中,重复出现的评论仅计算一次。
解法:
我使用 Counter 统计各个地点的评论,同时确保忽略同一地点的重复评论。然后使用 二分搜索 找到出现次数最高的评论。

  1. 找出可以组成的最小奇数
    问题描述:
    给定一个数字,重新排列其数字以组成最小的奇数。
    示例输入 & 输出:
    输入: 29031 → 输出: 139
    输入: 2020 → 输出: None
    输入: 9999993333311 → 输出: 1133333999999

解法:

  • 将数字转换为字符串列表。
  • 提取所有奇数 (d % 2 == 1)。
  • 排序后形成最小的有效奇数。
  • 转换回整数得到最终结果。
  1. (只剩 1 分钟!)
    最后一个是书店相关的问题,涉及连续2 年的事件。由于时间太短,我没来得及完整读题,直接进入 SQL 部分。

SQL 题目

  1. 基础聚合
    查找 transactions 表中的 总销售额 和 总独立客户数。
    SELECT
    SUM(payment) AS total_sales,
    COUNT(DISTINCT customer_id) AS total_customers
    FROM transactions;

  2. 找出推荐客户中,购买书籍平均支付金额最高的前 5 个客户
    问题描述:
    识别 推荐客户,找出他们的被推荐客户 平均书籍购买金额最高 的前 5 名。
    关键点:
    每笔交易可能涉及多本书,因此计算平均值时,总支付金额需要除以书籍总数。
    解法:
    使用 CTE(公共表表达式) 计算每个客户的总支付金额,然后按照推荐人客户进行排名。
    WITH payment_summary AS (
    SELECT referred_by_customer_id,
    SUM(total_payment) / SUM(book_count) AS avg_payment
    FROM transactions
    GROUP BY referred_by_customer_id
    )
    SELECT referred_by_customer_id, avg_payment
    FROM payment_summary
    ORDER BY avg_payment DESC
    LIMIT 5;

  3. 作者统计
    计算:

  • 作者总数。
  • 未出版任何书籍的作者占比(books 表中没有该 author_id)。
  • 未产生任何销售的作者占比(transactions 表只存 book_id,没有 author_id,因此需要额外 JOIN)。
    解法:
    使用 LEFT JOIN 找出缺失的作者记录。
    SELECT
    COUNT(DISTINCT a.author_id) AS total_authors,
    SUM(CASE WHEN b.author_id IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(DISTINCT a.author_id) AS no_books_percentage,
    SUM(CASE WHEN t.book_id IS NULL THEN 1 ELSE 0 END) * 100.0 / COUNT(DISTINCT a.author_id) AS no_sales_percentage
    FROM authors a
    LEFT JOIN books b ON a.author_id = b.author_id
    LEFT JOIN transactions t ON b.book_id = t.book_id;



面试总结
整个面试节奏非常快,在解决算法题的同时,还要确保 SQL 书写精确高效。如果你正在准备 Meta 数据工程师 面试,重点关注:

  • 优化计数算法(Counter, HashMap)
  • 字符串处理 & 排序
  • 滑动窗口 + 动态规划
  • 图遍历技巧
  • SQL 聚合 & CTE
  • 多层级 Join
  • 数据转换逻辑(例如计算平均值的修正)
    希望能帮助到未来的面试者!🚀
    如果你也经历过类似面试,欢迎留言交流你的思路!
Related Experiences