ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

蚂蚁工程数据岗笔试全复盘:算法、SQL、Flink考点经验

2026/9/1 6:27:17 拓冰建站 浏览量
蚂蚁工程数据岗笔试全复盘:算法、SQL、Flink考点经验 1. 为什么工程数据岗的笔试要先搞明白考什么、怎么考2024年秋招我投了蚂蚁集团的工程数据岗从简历筛选到笔试通知中间隔了大概一周。说实话收到笔试链接那一刻我是有点懵的——因为工程数据岗这个名字本身就有点模糊它既不像纯后端开发岗那样大家都能说出个大概也不像算法岗那样有明确的刷题路径。我身边很多同学都以为这岗考的是数据分析结果进去一看Java并发、SQL窗口函数、Flink原理、算法题全都有。所以这篇复盘我想先聊一个很多人忽略的问题你到底在考什么。工程数据岗在蚂蚁内部主要做的是数据管道、实时计算、数据治理、离线数仓这一类方向也就是把业务数据从源头采集、清洗、加工成可用的数据资产。这个岗位的笔试不会只考数据分析它更看重的是你能不能写对代码、能不能处理大数据场景下的计算问题。换句话说它考察的是一个会写代码的数据工程师而不是会看报表的数据分析师。这一点直接从笔试题目分布就能感受到——算法题占了很大比重SQL也是偏复杂查询而不是简单select。还有一个很重要的点工程数据岗的笔试和纯后端岗笔试的重合度大概有六成剩下四成是大数据组件和SQL的专属考点。所以我后来复盘时有个很深的感受如果你只刷LeetCode不练SQL想靠运气过笔试是很悬的反过来如果你只背组件原理不刷算法编程题大概率做不完。笔试的设计逻辑其实非常清晰就是筛掉那些偏科的人。另外要提醒一句蚂蚁的笔试是在牛客网这种在线OJ系统上进行的全程摄像头监控不能切屏切屏超过一定次数会被判作弊。所以考前一定要把网络、浏览器、摄像头都调试好。我笔试那场就有个同学因为电脑弹窗导致切屏被警告后面整个人心态都受影响了。这些细节看起来很碎但实际影响非常大。2. 考前信息战从岗位JD倒推考点再定刷题计划很多人准备笔试是看到什么刷什么今天做几道数组题明天看两个Flink原理视频结果到考场上发现会的没考、考的不会。我的经验是准备笔试一定要从岗位JD倒推考点再倒推刷题计划这样才能把有限的时间用在刀刃上。2.1 JD里藏着笔试考察方向我当时把蚂蚁工程数据岗的岗位描述翻来覆去看了好几遍摘出几个关键信息一是要求扎实的Java或C编程基础二是熟悉Hadoop、Spark、Flink等大数据框架三是熟悉SQL和数据仓库建模四是具备一定的算法与数据结构能力。如果你看到这样的JD基本可以推断出笔试的两个大头第一是编程题考察数据结构和算法第二是专业题考察Java基础、SQL和大数据组件原理。我把JD里的每个要求对应到了具体的笔试考点列了一个表格照着这个表格复习效率和漫无目的刷题完全不一样JD要求对应笔试考点复习优先级扎实的编程基础数组、链表、栈、队列、哈希、二叉树、动态规划高熟悉大数据框架Hadoop HDFS读写流程、Spark RDD/Shuffle、Flink 状态与Checkpoint高熟悉SQL窗口函数、多表关联、去重排序、行列转换、连续问题高具备算法能力TopK、LRU、字符串处理、前缀和、双指针高Java基础集合源码、并发编程、JVM内存模型、类加载中高数据仓库建模星型模型、拉链表、缓慢变化维、事实表与维度表中2.2 题库选择和刷题优先级确定考点之后接下来就是选题库。我个人的组合方案是LeetCode Hot 100 牛客SQL大厂真题 大数据组件原理题。LeetCode不用多说了Hot 100过两遍基本能覆盖笔试里大部分常规算法题。SQL部分牛客上有专门的大厂真题练习区里面有大量真实面试难度的SQL题比LeetCode的数据库题更贴近国内大厂风格。大数据组件题在牛客、LeetCode上都没有特别系统的题库只能靠看面经总结我当时是把牛客上关于蚂蚁工程数据岗的笔试面经翻了个遍把能收集到的题目类型都整理出来了。刷题优先级上我建议是SQL和算法题最优先JVM和并发其次大数据组件原理可以放在选择题冲刺阶段集中背。因为SQL和算法是编程题的主战场占比高、拉分大值得投入最多时间。组件原理虽然也重要但更多出现在选择题里背诵性价比高但理解深度要求没那么高。2.3 四周复习计划参考我实际用的复习计划是四周周期比较适合时间适中、目标明确的情况分享出来给大家做参考第一周数据结构与算法强化。每天3道LeetCode中等题优先数组、链表、二叉树、动态规划周末做一次限时模拟。第二周SQL专项。每天5道SQL题覆盖窗口函数、连续登录、行列转换、留存计算等高频题型配合牛客SQL题库。第三周Java基础大数据组件。白天看Java并发和JVM晚上看Spark、Flink核心原理周末刷选择题。第四周真题模拟与查漏补缺。每天按正式笔试的时间节点做一套模拟题重点训练时间分配和抗压能力。这个计划最大的好处是把输入和输出结合起来了不是只看不练。第四周的限时模拟非常关键我第一次模拟的时候编程题根本做不完后来调整了答题顺序才改善这个后面专门说。3. 笔试题型拆解从选择题到编程题的实战复盘蚂蚁工程数据岗的笔试我当时参加的是约120分钟的线上笔试题量不算小。整体风格偏向基础扎实思维灵活没有特别偏门的知识点但想拿高分也不容易。下面按题型来复盘。3.1 选择题覆盖Java、SQL、大数据组件选择题大概有20到25道左右涵盖的范围很广。Java基础方面考了ArrayList和LinkedList的区别、HashMap的底层实现、并发编程里synchronized和ReentrantLock的区别、线程池的核心参数等。这些都是很典型的八股题难度不高但知识点细需要平时积累。SQL选择题基本就是给一段SQL问你执行结果或者给个业务场景让你选正确的SQL写法。这类题目考察的是对SQL语义的理解是否准确尤其是JOIN的细节、GROUP BY与HAVING的关系、窗口函数的执行顺序等。我有一个比较深刻的教训是ON和WHERE的执行顺序在LEFT JOIN里真的很容易混淆笔试就考了类似的题我当时差点选错。大数据组件选择题是大头也是工程数据岗和其他技术岗最大的区别。Hadoop、Spark、Flink都有涉及比如HDFS的副本放置策略、Spark RDD的依赖关系、Flink的Checkpoint机制、Watermark和窗口的关系、数据倾斜的处理方式等。这些题目不会特别深只要你系统看过组件核心原理基本能答对。但如果只是知道组件名字、没深入了解原理很容易被选项干扰。我复习时用了对比法把Hadoop、Spark、Flink的架构、计算模型、存储方式、容错机制放在一个表格里对比记忆效果很好。3.2 编程题常规算法题加一道SQL题编程题一般有两到三道通常包括一道算法题和一道SQL题有时候会加一道大数据场景题。我这场的结构是两道算法题加一道SQL题。算法题的方向比较常规一道是TopK问题的变体一道是字符串处理。难度大概在LeetCode中等不会到Hard但比Hot 100里的简单题要难一些。这类题目刷过LeetCode的人应该都能下手关键是在有限时间内写出正确且够高效的解法。SQL题是典型的大厂业务题给了一张用户登录表要求计算每个用户连续登录的最大天数。这类问题在SQL面试里太常见了核心是用窗口函数row_number date_sub来做分组之前如果专门练过连续登录类题目基本属于送分题。但如果没准备过考场上现场想可能要花不少时间。3.3 说说我印象最深的一道编程题有一道编程题我印象特别深题目大意是给一个很大的日志文件每行是一条用户访问记录包含用户ID、访问时间和访问页面要求统计每个页面独立访客数排名前10的页面。这道题本质上就是经典TopK问题但是套了一个大数据场景的外壳。如果用Java写核心思路就是先用HashMap统计每个页面的独立访客数然后用小顶堆维护TopK。我在考场上很快想到了思路但因为要处理独立访客这个条件哈希表存的时候需要先去重当时在去重的实现上稍微犹豫了一下最后用了HashSet套在HashMap的value里。这道题给我的启发是工程数据岗的算法题不会单纯考数据结构和算法它会把实际业务场景包装进去你需要快速把业务问题转化成算法问题。4. 最拉开差距的算法题思路、代码与现场心态算法题在整场笔试里的重要性不用多说它通常分值最高而且直接决定你能不能进下一轮。这里我想用一道TopK变体题作为例子完整还原我在考场的思考过程和解法。4.1 一道TopK变体的完整解题过程题目大致是给定一个字符串数组统计每个字符串出现的次数返回出现次数最多的前K个字符串如果出现次数相同则按字典序排序。这题在LeetCode上有原型就是前K个高频单词。我看到这题的时候心情是比较平静的因为它属于典型的哈希统计排序/TopK套路。我的解法思路分两步第一步用HashMap统计每个单词的出现次数key是单词value是次数第二步构建一个小顶堆堆内按出现次数从小到大排序如果次数相同则按字典序从大到小排序这样堆顶是最小的元素遍历完所有单词后堆里留下的就是出现次数最大且字典序靠前的K个。关键点在于利用优先队列时要注意Comparator的写法。我现场Java实现的核心代码如下public ListString topKFrequent(String[] words, int k) { MapString, Integer countMap new HashMap(); for (String word : words) { countMap.put(word, countMap.getOrDefault(word, 0) 1); } PriorityQueueString minHeap new PriorityQueue((a, b) - { if (!countMap.get(a).equals(countMap.get(b))) { return countMap.get(a) - countMap.get(b); } else { return b.compareTo(a); } }); for (String word : countMap.keySet()) { minHeap.offer(word); if (minHeap.size() k) { minHeap.poll(); } } ListString res new ArrayList(minHeap); Collections.sort(res, (a, b) - { if (!countMap.get(a).equals(countMap.get(b))) { return countMap.get(b) - countMap.get(a); } else { return a.compareTo(b); } }); return res; }这里要注意几个细节一是小顶堆的堆顶是当前最小的当堆大小超过K时弹出堆顶最终留下的就是最大的K个二是当次数相同时字典序小的应该留在堆里所以比较器里字典序那一项要反过来写也就是b.compareTo(a)三是最后从堆里取出结果时顺序是乱的需要二次排序恢复成题目要求的顺序。这些细节如果平时没写熟考场上很容易翻车。4.2 遇到没思路的题怎么办先暴力再优化笔试现场最怕的就是碰到一道题完全没有思路。我的策略是首先快速判断这题的考点是什么如果5分钟内想不出最优解就直接写暴力解法。理由很简单笔试OJ判题是按用例给分的暴力解至少能过一部分用例比交白卷强得多。写暴力解的时候一定要把想法和注释写清楚方便后面有时间回来优化。很多牛客的笔试是支持多次提交的你可以先提交一个暴力解拿保底分然后继续想优化方案。我笔试时第二道算法题就差点卡住题目涉及字符串的某种变换我当时第一反应是这题跟滑动窗口有关系但是窗口的左右边界怎么移动想了好几分钟没想清楚。后来我果断放弃了一次写对最优解的想法先写了一个双层循环的暴力解提交后大概过了30%的用例。拿到保底分之后我重新理了一下思路发现可以用前缀和数组把部分重复计算优化掉最后优化完过了全部用例。这段经历让我彻底明白笔试不是竞赛得分才是硬道理不要在纠结中浪费时间。4.3 现场心态管理的几个细节心态这件事听起来虚但真的很影响发挥。我有几点实际感受拿到题先深呼吸快速归类考点不要一上来就写代码。脑子里的锚点很重要看到求前K个就想到堆看到连续子数组就想到前缀和看到字符串匹配就想到双指针或KMP这些套路能帮你快速进入状态。遇到卡壳超过10分钟就跳过做后面会做的题回过头来再看卡壳的题往往会有新的思路。我笔试时有一道算法题就是这样先跳过做SQL题回头再来看反而一下子想到了解法。不要盯着计时器看尤其是时间剩得不多的时候越看越焦虑。可以把剩余时间拆成几个阶段比如还剩60分钟时应该做到哪还剩30分钟时应该做到哪心里有个底就行。5. SQL与大数据组件题工程数据岗的专业分水岭算法题大家都会刷真正把工程数据岗和其他岗位拉开差距的其实是SQL题和大数据组件题。这一块如果你有数仓实习或者平时工作接触过大数据组件会觉得很简单但如果没有实际经验只能靠临时背考场上很容易露馅。5.1 SQL高频题型连续登录、行列转换、留存率SQL题在笔试里的地位非常高因为它直接对应了未来工作里最核心的能力——写数据查询和分析SQL。我整理过工程数据岗笔试SQL题的高频题型主要集中在三类一是连续登录问题。经典场景是给一张用户登录表计算每个用户连续登录的最大天数。核心解法是用窗口函数给每个用户的登录日期编号然后用登录日期减去编号得到一个新的日期字段如果日期相同说明是同一段连续登录。具体SQL如下select user_id, max(continue_days) as max_continue_days from ( select user_id, date_sub(login_date, row_number() over (partition by user_id order by login_date)) as grp_date, count(*) over (partition by user_id, date_sub(login_date, row_number() over (partition by user_id order by login_date))) as continue_days from user_login group by user_id, login_date ) t group by user_id;这个解法是分组求最大值的思路先给连续日期打上同一个标记再按标记分组统计数量最后取最大值。这种题没有任何捷径就是多练几遍把套路刻在脑子里。二是行列转换。比如把一张长表转成宽表或者把宽表转成长表。这类题考察的是CASE WHEN和UNION的灵活运用平时多写几遍就熟练了。三是留存率计算。给用户活跃表计算某天新增用户在之后第N天的留存率。核心是理解新增用户和活跃用户的区别然后通过JOIN和日期差计算。5.2 大数据组件题掌握原理比背八股重要大数据组件相关的选择题和简答题是工程数据岗笔试的个性题。我当时复习时重点看了几个方向Hadoop的HDFS读写流程、MapReduce的Shuffle过程、Spark的RDD依赖和DAG、Spark和Flink的容错机制区别、Flink的Watermark和窗口、数据倾斜的原因和解决方案。这里最常考的一个点是数据倾斜。题目通常会给你一个场景比如两张表JOIN时某个key的数据量特别大导致reduce端负载不均问你该怎么解决。我建议至少要掌握以下几个方案对倾斜key加随机前缀打散、广播小表避免Shuffle、调整并行度、两阶段聚合。这些方案笔试会考面试还会追问值得深入理解而不是死记硬背。还有一个高频考点是Spark和Flink在容错上的区别。Spark用Lineage血缘机制通过RDD的血缘关系重新计算恢复数据Flink用Checkpoint分布式快照通过周期性保存状态快照实现精确一次语义。这两个都是各自框架的核心机制一定要能说清楚它们的设计思路和适用场景。5.3 一道选择题启发我重新理解SQL执行顺序笔试里有一道选择题我印象很深问的是SQL语句中WHERE、GROUP BY、HAVING、SELECT、ORDER BY的执行顺序。看起来很简单但很多平时写SQL的人根本说不清楚。正确答案是FROM是最先执行的然后WHERE再GROUP BY再HAVING再SELECT最后才是ORDER BY和LIMIT。这个执行顺序决定了你在WHERE里不能使用SELECT里定义的别名但在ORDER BY里可以使用。我后来把这个知识点记到了自己的SQL笔记里因为很多业务SQL写错就是因为没搞清楚执行顺序。比如有人想对分组聚合后的结果过滤把条件写在了WHERE里而不是HAVING里结果报错或者结果不对。这种题考察的不是你会不会写SQL而是你有没有真正理解SQL的执行逻辑这也是工程数据岗需要具备的思维。6. 时间分配与答题策略别让会做的题被时间拖死笔试时间有限做题顺序和时间分配在很大程度上决定了你的成绩。我第一套模拟题就是吃了顺序的亏一上来死磕算法题结果后面简单的选择题都来不及做白白丢了很多分。6.1 我的答题顺序先做选择题再做SQL题最后做算法题我的实际策略是拿到试卷先快速浏览一遍全部题目对难度有个大致判断然后按照选择题 → SQL题 → 有思路的算法题 → 没思路的算法题的顺序来做。理由是选择题虽然知识点碎但单个题耗时短、分值固定适合在头脑最清醒的时候快速拿下SQL题只要会写得分效率很高而且答案相对确定算法题费时最长不确定性最大放到后面做更合理。很多人的习惯是先做分值高的算法题我觉得这恰恰是误区。大厂笔试的通过标准是总分过线而不是某一道题拿满分。用更少的时间拿到更多的基础分比花30分钟死磕一道算法题要划算得多。6.2 每类题目的时间预算参考我当时给自己定了一个时间预算大概是这样题型建议时间策略说明选择题25-30分钟每题控制在1-1.5分钟不会的果断蒙一个并标记SQL题25-30分钟先写出正确版本再考虑优化不要一上来就写复杂解法算法题第一题20-30分钟这是最容易拿分的算法题全力以赴算法题第二题15-20分钟10分钟没思路就写暴力解拿保底分检查和提交10-15分钟重点检查编译错误、输入输出格式、边界条件这个预算不一定适合所有人但有一个原则是通用的一定要给检查留时间。我见过太多人写完代码就提交结果因为Scanner读取格式不对或者没有处理空输入被扣分。这些不是不会做而是太亏了。6.3 编程题提交前的检查清单说到提交检查我总结了一个简单的清单每次提交前都按这个过一遍输入输出格式是否正确题目要求多组输入还是单组输入用的是Scanner还是BufferedReader。有没有处理边界条件比如数组为空、k为0、字符串长度为1。数据类型是否溢出比如用int还是longTopK和累加计算很容易溢出。题目的方法签名是否符合要求牛客笔试有时候要求你实现某个类方法类名和方法名都不能改。时间复杂度和空间复杂度是否会被卡如果题目给的数据量很大暴力解可能直接超时至少要先算一下复杂度。这些检查项看起来基础但每次笔试都有人在上面翻车。我建议平时刷题的时候就养成这个习惯不要只埋头写代码要站在OJ的角度审题。7. 笔试之后复盘、面试衔接与抗遗忘安排笔试结束不代表这件事就完了。我身边很多同学考完就彻底放飞自我等收到面试通知才开始慌。实际上从笔试到面试的间隔期是最重要的准备窗口能不能利用好这段时间决定了你在面试时是讲得出深度还是只能聊表面。7.1 考后立刻做一次趁热复盘笔试结束当晚趁记忆还新鲜我建议立刻做一次复盘。我当时是打开备忘录把能回忆起来的题目类型、考察知识点、自己做错的点、有疑虑的题全部记下来。不要只记题目要记我为什么做错了和下一次遇到同类题应该怎么想。这个动作看起来简单但非常有价值因为笔试考察的很多知识点在面试中会被问到考后复盘相当于提前做了面试梳理。比如我在SQL那道连续登录题上虽然做对了但复盘时发现自己对date_sub和row_number配合的本质原理理解得不深。于是面试前我又专门搜了相关博客重新理解了一遍用日期减去编号把连续区间变成同一分组这个思路的数学原理结果面试时真的被追问了。如果不是考后复盘把这个薄弱点标记出来我面试很可能答不好。7.2 把笔试知识点延展成面试口语化表达笔试是选择题和编程题面试是口头交流和手撕代码这中间有个转换过程。笔试时你只要选出正确答案面试时面试官会追问为什么选这个和还有没有其他方案。我的建议是趁着笔试后对知识点的印象还很深挑几个核心内容做一次口述练习。比如Flink的Checkpoint机制你不能只说通过Checkpoint实现状态恢复要能讲清楚检查点是怎么触发的、Barrier对齐是怎么回事、精确一次和至少一次的区别、状态后端有哪些。再比如数据倾斜不能只说加随机前缀要能说明加前缀后如何进行两阶段聚合、性能代价有多大、什么场景下适合用广播变量。这种把知识点从认识变成会讲的过程是面试准备中最有价值的部分。7.3 个人的一点体会笔试是短板探测器这次笔试给我最大的收获不是流程走完了而是让我看清了自己在哪些方面还有短板。我在复习阶段自我感觉SQL还不错但实际笔试时发现自己在窗口函数的某些边界场景下还是会犹豫我以为自己对Spark很熟但选择题里考到RDD的窄依赖和宽依赖时有个选项让我纠结了很久。这些自我感觉良好但实际还不够扎实的地方如果不去笔试检验可能永远不会暴露。所以我也想给正在准备秋招的人一个建议不要只盯着笔试通过与否看把它当成一次免费的压力测试和短板探测器。每一道做错的题、每一个卡壳的瞬间都是后续复习最明确的指引。2024年秋招竞争确实不小但工程数据岗的核心考察方向其实是清晰和稳定的把算法、SQL、大数据组件、Java基础这四个方向扎扎实实准备好笔试这关没有想象中那么可怕。