从业几年后再回头看2018年前后的网易大数据开发实习生笔试题其实很能代表那一波互联网大厂对“校招大数据人才”的定位。它不堆砌冷门概念也没有故意出偏题怪题但覆盖面足够广Java基础、Hadoop生态、Hive SQL、Linux命令、数据结构与算法甚至还有一两道需要现场设计思路的场景题。我那会儿刷这套题的时候还在学校里对很多知识点停留在“用过”但“说不清原理”的阶段考完对答案才发现笔试筛人真的不靠难靠的是你有没有真正动手处理过数据。这篇文章就从这套题出发把大数据开发实习生笔试背后的技术栈、考点分布、解题思路和备考路线完整拆一遍。不管你是准备校招、想转行大数据还是已经在职但想补一补基础都可以拿这套框架做参考。1. 先看透笔试逻辑网易在筛选什么样的人1.1 大数据岗的选人标准和你想的不太一样很多人以为大数据开发实习生的笔试题会以“框架八股”为主比如问MapReduce的shuffle有几个阶段、Spark的宽窄依赖怎么区分。这类题确实会考但比重没有想象中那么高。网易这套2018年的题目给我的感觉是它更在意你写代码的基本功和排查问题的思路。原因是实习生进组之后大部分精力会花在写SQL跑数、调Hive任务、改Spark任务、处理脏数据这些事情上。框架的原理可以边做边学但SQL写不写得出来、Java基础扎实不扎实、Linux命令熟不熟练这些是没法速成的硬功夫。笔试出题人心里很清楚短期实习几个月他们需要的是“能直接帮忙干活的人”而不是“理论大师”。这也解释了为什么卷子里会同时出现字符串反转、TopK这类算法题和一道带业务背景的SQL统计题。前一秒还在考HashMap扩容后一秒就切到电商订单表的分组聚合这种节奏本身就是大数据开发日常工作的缩影一会儿写通用代码优化性能一会儿写临时查询捞数据排查线上问题。1.2 从岗位JD反推考点优先级当时网易大数据开发实习生的JD里高频出现的词是Hadoop、Spark、Hive、Java、SQL、Linux。对照笔试内容基本能画出清晰的考点权重考点方向常见题型优先级理由Java基础与并发选择题、简答高大数据框架大多基于JVMJVM与并发是避不开的坎数据结构与算法编程题、思路题高校招筛选的通识项考察代码基本功Hive SQL与数据仓库手写SQL、场景设计高实习生入职后最日常的工作就是写SQLHadoop/Spark原理简答、概念判断中高需要理解核心机制但不要求源码级深度Linux与Shell命令题、排错题中排查日志、跑任务的前置技能如果你备考时间有限按这个权重去分配复习精力基本不会跑偏。最忌讳的是在偏冷门的框架细节上花大量时间比如去纠结HBase的Region分裂机制结果SQL窗口函数和MapReduce流程这种必考题没答利索。2. 核心考点拆解大数据实习生要啃下的六块硬骨头2.1 Java基础与并发编程别让框架短板变成筛人利器Java在整套笔试题里的存在感非常强。选择题常考察HashMap在JDK 1.7和1.8的区别、ArrayList和LinkedList的复杂度差异、线程创建的几种方式、synchronized和ReentrantLock的区别。这些题目看似基础却最能筛选出“背了八股但没写过代码”的人。举个例子HashMap的扩容机制经常被拿出来做文章。很多人在准备时能背出“默认容量16加载因子0.75扩容为原来的两倍”但题一旦问到“并发put时为什么会丢数据”就答不到点子上了。原因在于JDK 1.7的HashMap扩容采用头插法并发环境下多线程同时rehash会形成环形链表导致get操作死循环。JDK 1.8改成尾插法后环的问题解决了但put的原子性依然没有保障所以并发场景还是要用ConcurrentHashMap或Collections.synchronizedMap。备考建议是不要停留在背结论而是自己动手跑一遍。我那时候把Java并发相关的Demo都打印上日志反复调线程数观察输出顺序才算真正理解了锁的机制。笔试考得不深但你需要能讲明白“为什么”而不是只会说“是这样”。2.2 Linux与Shell数据工程师的基本功大数据开发几乎每天都要泡在Linux环境里查日志用grep和awk看任务状态用ps和top操作HDFS文件用hdfs dfs命令提交作业用spark-submit。笔试一般不会考太复杂的Shell脚本但基础命令和管道组合是常客。常见考法有两种。一种是给你一段日志文件问怎么统计某个状态下出现的次数。这种题标准答案就是一条管道命令grep ERROR app.log | wc -l简单归简单但很多非科班同学会在这里卡住因为他们平时习惯了用Excel打开日志根本没想过用Linux命令做文本处理。另一种考法是给一个具体场景比如“磁盘满了怎么找到占用空间最大的目录”这种题考察的其实是du、df、sort、head这些命令的串联能力du -h /data/* | sort -rh | head -10答这种题的时候建议把思路写在答案前比如先说明“先用du统计各目录大小再用sort按人类可读格式逆序排序最后取前10行”。把思路写清楚就算某条命令记混了面试官也能看出你是真用过还是背的。2.3 Hadoop与MapReduce理解数据分治的本质Hadoop这部分笔试重点通常落在MapReduce的执行流程上而不是配置文件的参数。你要能说清楚一个MapReduce任务从提交到结束经历了哪些步骤客户端提交JobResourceManager分配容器NodeManager启动ApplicationMaster然后Mapper读取输入分片map函数处理键值对经过分区、排序、溢写、合并、Shuffle等环节把数据交给Reducer最后写出结果。其中Shuffle是最容易被追问的细节也是笔试简答题的高频题。Map端的Shuffle包括分区、排序、环形缓冲区溢写、合并Reduce端的Shuffle包括拉取、合并归并、分组。面试官在问到这一块时通常还会追问“Combiner有什么作用”答案是“在执行Map输出之后、网络传输之前做一次局部聚合减少shuffle的数据量”。我见过很多人把Combiner和Reducer的概念混淆其实Combiner和Reducer逻辑可以复用同一个类但计算的是局部结果且要保证输入输出类型一致否则会出错。别小看这种基础原理题它决定着你入职后能不能快速定位任务运行缓慢的原因比如数据倾斜、小文件过多、Reducer数量设置不合理等。我在实际工作里排查慢任务时第一反应就是回到MapReduce流程里找哪个环节成了瓶颈这就得益于当年笔试复习时把流程背得滚瓜烂熟。2.4 Hive SQL与数据仓库分析类任务的核心生产力大数据开发实习生每天干得最多的活就是写Hive SQL提数。所以手写SQL在笔试试卷里基本是必考项而且分值不低。网易这套题里的SQL考法比较典型不是让你默写某条语法而是给你两张业务表让你写出满足某个统计需求的查询。高频考点包括分组统计、多表关联、去重统计、行转列列转行、窗口函数求TopN、日期函数处理。以行转列为例假设有一张课程成绩表每行是学生ID、课程名、成绩需要输出一个宽表每个学生一行各科成绩是一列。常规写法就是通过sum配合case when或if做条件聚合SELECT student_id, MAX(IF(course math, score, NULL)) AS math_score, MAX(IF(course english, score, NULL)) AS english_score, MAX(IF(course chinese, score, NULL)) AS chinese_score FROM score_table GROUP BY student_id;还有一个特别常见的坑是“统计每个用户最近一次下单时间”这类需求如果不熟悉窗口函数容易写得很绕。用row_number() rank() over(partition by user_id order by order_time desc)就能轻松解决SELECT user_id, order_time FROM ( SELECT user_id, order_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time DESC) AS rn FROM order_table ) t WHERE rn 1;这里需要注意Hive对窗口函数的支持相对完整但MySQL直到8.0才支持窗口函数。笔试的时候如果明确说环境是Hive放心用如果只是普通SQL题可以先用子查询加关联实现再补充一句“如果支持窗口函数还可以这样写”反而更能加分。2.5 Spark与实时计算那个年代的加分项2018年前后Spark和Flink正处在上升期很多公司的面试题里已经开始出现Spark相关的内容。网易这套题对Spark的考察相对克制但也会涉及基本概念比如RDD的宽窄依赖、Spark任务的执行流程、reduceByKey和groupByKey的区别。千万别小看“reduceByKey和groupByKey的区别”这道送分题它几乎是那几年Spark岗位的必考题。核心答案有两点第一reduceByKey在map端会做combiner也就是先局部聚合再传输而groupByKey不做直接传输全量数据第二reduceByKey适用于对value做聚合操作的场景groupByKey更灵活但开销更大。如果能再补一句“因此在实际开发中能用reduceByKey的地方就不要用groupByKey”面试观感会好很多。当时懂Spark的校招生确实有优势。因为很多学校实验室还在教MapReduce学生简历里写了Spark大概率是真自己研究过这样一个简单的区别就足够笔试阅卷人判断你的实战倾向了。2.6 数据结构与算法通识能力决定上限大厂笔试题的最后一道大题通常是算法题网易也不例外。大数据方向的算法题不会出到竞赛难度但LeetCode中等题的概率很大偶尔会有简单偏难一点的。常考的类型包括数组、字符串、链表、二叉树、堆、前缀和、双指针。对于大数据开发岗建议重点准备两类题一是排序搜索类比如基于TopK的堆排序实现二是字符串处理比如反转字符串、大数相加、括号匹配。我当年备考时养成了一个习惯写完算法题后会主动分析时间复杂度和空间复杂度并注明“如果数据规模达到海量改用外部排序或位图法是否能优化”。笔试对复杂度的要求其实不高但你主动写出了这层思考阅卷人会认为你具备数据规模的意识这正是大数据岗位很看重的能力。3. 典型题型实战从题目到答案再说清思路3.1 手写SQL分组排序、TopN与行列互转手写SQL是大数据开发笔试的“主菜”分值占比和算法题不相上下。我从当年整理的笔经里挑了几类反复出现的题型给大家拆一遍答法。第一类分组TopN。需求通常是“统计每个部门薪资最高的前3名员工”。核心思路是使用窗口函数SELECT department_id, employee_id, salary FROM ( SELECT department_id, employee_id, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rk FROM employee ) t WHERE rk 3;这里有个细节RANK和DENSE_RANK、ROW_NUMBER的区别要分清。RANK在出现并列时会跳过排名号比如两个第1名后下一个是第3名DENSE_RANK不跳号两个第1名后下一个还是第2名ROW_NUMBER则完全按顺序编号即使值相同也强制区分。笔试时如果没有特别说明TopN用RANK更符合业务直觉。第二类行列互转。除了前面说的条件聚合写法还可以用collect_list或collect_set结合concat_ws实现。Hive里常见做法是SELECT student_id, CONCAT_WS(,, COLLECT_LIST(course)) AS course_list FROM student_course GROUP BY student_id;这类题考的是对聚合函数特性的理解COLLECT_LIST保留重复元素COLLECT_SET自动去重。实际工作中建用户标签宽表时经常用到这个技巧。第三类连续登录天数。这个题型在网易笔试里出现过变体。给定用户登录日期表统计连续登录超过3天的用户。标准解法是利用日期与行号的差值连续区间内这个差值不变SELECT user_id FROM ( SELECT user_id, login_date, DATE_SUB(login_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date)) AS grp FROM login_log ) t GROUP BY user_id, grp HAVING COUNT(1) 3;如果能现场写出这段SQL在评分上会比较有优势因为这道题在网上流传很广但能真正理解其思路的人不多。3.2 MapReduce编程题WordCount只是入门没有一道大数据笔试能绕开WordCount但仅仅会写WordCount远远不够。网易这类公司更想看到的是你对“MapReduce适合解决什么问题”的理解。常见的问法是给定一个日访问日志需要统计每个页面在每小时内的访问量怎么用MapReduce实现答案要点是Mapper端把“页面ID-小时”拼成keyvalue记为1Reducer端直接遍历values求和。如果能补充回答按小时分区让每个Reducer处理一个小时的维度数据就更能体现对Partitioner的理解。在写MapReduce代码的时候很多同学会漏掉一个关键点Mapper输入默认是Object行号和Text行的键值对你在map函数里要先拿到单独一行文本再按分隔符切分。类似这样的细节笔试手写试卷是体现不出来的但面试聊到项目时一定会暴露。所以备考时我建议大家至少在本地跑通一次WordCount用打包好的jar提交到单机Hadoop上执行一遍这会帮助你把整个执行流程串起来。3.3 算法题大数据场景最常考的几类题算法题是大数据笔试里最容易拉分的部分。从网易各岗位的笔经来看有几类题几乎是必考题。第一类是TopK问题。大数据场景下经典问题是“10亿个数中找最大的100个”考察点在于不能直接排序因为有内存限制。最优方案是用大小为100的小顶堆遍历数据时和堆顶比较比堆顶大就替换并调整堆复杂度是O(n log k)。如果题目再追问“数据量更大怎么办”可以补充使用分治思路先Hash分片每个分片单独求TopK最后再汇总各分片的TopK求全局TopK。第二类是海量数据去重。典型问题是“统计一天内UV去重后的用户数”。答案不唯一可以从HashSet、BitMap、BloomFilter三个层面回答。HashSet简单但内存占用大BitMap能压缩空间但只适合ID可映射为连续整数的场景BloomFilter误判率可接受适合需快速判断“是否存在”的场景。如果能画一个简单的BloomFilter哈希过程图不需要精确画个示意并说明误判率的计算公式差不多就能在这道题上拿满。第三类是大数运算。大数据面试经常会问“两个超大整数相加怎么办”考察点不是BigInteger而是字符串模拟加法的能力。要注意进位和两个字符串长度不一致的情况代码写完后一定要自己跑几个边界用例比如“9991”和“00”。3.4 概念问答题答得准还要答得深概念问答题看起来简单却是大多数人的丢分点因为只背一层定义是远远不够的。阅卷人通常从答案中寻找“你是否踩过坑”的信号。以“数据倾斜是什么怎么解决”为例多数人只会说“某个reduce处理的数据量特别大”。这个回答只能拿基础分更好的回答是复述完整链路数据倾斜发生在shuffle阶段常见原因包括key分布不均、业务数据本身存在热点、小表关联大表时关联键有空值。解决手段包括过滤空值或单独处理增大Reduce并行度对key加随机前缀打散或者使用Salting方式。如果还能给出一个自己亲眼见过的真实案例哪怕是很小的案例这一题基本就稳妥了。我自己在这儿栽过跟头第一次笔试只写了“加随机前缀”一句话完全没提及怎么加、加完以后如何还原自己回看都觉得不够专业。后来准备面试时我把这个问题的回答固化为“原因判断—定位确认—方案对比—落地执行—效果验证”五步每次都按这个节奏讲效果好了很多。4. 笔试现场的时间分配与踩坑实录4.1 不同题型的性价比排序一份在线笔试题时间通常在90到120分钟题目量大概在20到30道之间其中选择题占了大头编程题一到三道。如果你打算“选择题慢慢想最后做编程题”大概率会翻车。我建议拿到试卷后先花2分钟把所有题目扫一遍按性价比排序能秒答的基础题概念题、简单选择题优先需要思考的SQL题其次编程题中的简单题再次最后把时间留给不确定的深入题和算法优化题。选择题如果卡了超过2分钟直接标记跳过千万不要在一道题上恋战。因为很多在线笔试系统不支持回头再看做过的题跳过了就只能猜一个答案与其纠结错题不如抓紧后面的分数大头。严格来说笔试系统并不“鼓励”猜题但空着一定没分填一个至少还有概率。我当年有同学在选择题上花了40分钟最后编程题只剩15分钟结果两道编程题全部超时空着交卷这属于明显的策略失误。4.2 我见过的高频翻车现场翻车现场一SQL没考虑去重。真题常常会问“每个用户每天首次登录的渠道”很多考生写着写着就忘了同一用户同一天可能会登录多次导致统计数据偏大。这个问题最容易出现在使用ROW_NUMBER时注意不到分母是重复数据的场景。翻车现场二算法题只写核心函数不处理边界条件。卷面上如果用“TODO”占位代码不完整基本告别晋级机会。笔试阅卷流程是机器和人工结合机器跑用例时发现空指针直接判错。翻车现场三Java代码写出运行时异常。比如用substring时没判null或者数组越界。这个问题往往是因为平时写代码依赖IDE的自动提示和编译检查一到手写代码就露怯。备考阶段一定要摆脱IDE直接在编辑器里写完整代码然后用命令行javac编译调试。翻车现场四心态崩坏影响后续发挥。部分在线笔试系统每提交一题就会立刻反馈是否通过如果你的某道题跑挂了很容易影响后面的节奏。建议提前做好心理建设一道题挂掉不代表整体凉了改完赶紧看下一道题。4.3 在线笔试的硬件与网络准备在线笔试虽然考的是技术但硬件和网络问题同样能让技术归零。我那次笔试前电脑里有一堆Chrome插件考试时某个插件弹窗导致页面卡死差点没有提交成功。后来我把浏览器改成无痕模式删掉不必要的插件才勉强稳住。需要检查的点包括Chrome浏览器是否满足监控要求、摄像头能否正常授权、网络是否稳定、备用电源是否足够、有没有安装录屏软件在内的额外后台程序。很多笔试平台会检测设备风扇状态如果后台开太多无关程序可能会被判定为疑似有作弊行为。如果有条件笔试前一定要用往年的模拟卷做一次“全仿真演练”设置相同的时间限制关闭所有无关网页和软件强迫自己进入考试状态。这不是浪费时间而是提前排雷。5. 笔试之后从一份试卷延伸到offer的长线规划5.1 笔试错题如何转化成面试资本笔试结束不代表复习结束。我自己的习惯是每次笔试完都把做错的题和拿不准的题整理成错题笔记按“题目—我的答案—标准思路—问题原因”四栏整理并用一句话总结核心教训。比如某次我把Shuffle的排序时机弄错了笔记里就写“Map输出先分区后排序并不是先排序再分区默写过程是在环形缓冲区依次做分区和排序”。后续面试碰到此类基础题时翻翻笔记就能快速回忆起来还能顺带说出自己曾经在哪里理解偏差。这个错题本还有一个好处就是在准备技术面时能帮你快速定位薄弱环节。笔试里丢分的知识点面试里大概率还会再考一遍。5.2 实习生入职前的两个月可以怎么准备如果你顺利过了笔试和面试收到了实习offer恭喜你但这不代表可以休息。从收到offer到入职之间通常有两个月左右的时间这可能是你未来职业生涯里最后一段可以自由学习的窗口。建议重点做三件事。第一把Linux操作练到熟练日常的CD、日志查看、进程管理、常用awk和sed命令要能条件反射般打出来。第二熟悉Hive SQL的常见函数特别是日期函数、聚合函数和窗口函数能熟练完成常见统计。第三如果公司技术栈涉及Spark建议把官网Quick Start跑一遍熟悉spark-shell环境和基本RDD算子的使用。我不建议在这段时间内突击大数据框架的源码看源码这种工作更适合入职后有明确需求时再深入没有上下文支撑很容易看过就忘。5.3 关于简历与投递策略的个人建议最后聊一点简历。很多人投大数据开发岗时简历上写“熟悉Hadoop、Spark、Hive”但没有任何能证明动手经验的产出。面试官一问“你做过什么数据任务”就只能答“跟着教程跑了WordCount”这基本聊死。在校生的项目经验不一定要多高大上可以是自己爬一份数据集导入Hive做清洗和统计再用Sqoop导回MySQL最后做一个可视化图表。整个过程用到的知识正好覆盖大数据开发的基础链路写在简历上非常能打。如果连这个都没有哪怕只在开源社区做过一次代码贡献或在校内帮课题组清洗过一份几十万行的实验数据都可以写上去。简历是笔试的敲门砖方向不匹配再优秀的背景也容易被刷。投递大数据开发岗简历里要有意识地呈现“数据量、数据问题、解决办法、结果收益”这条线而不是罗列技术名词。我从大二开始第一次接触Hadoop到实习、正式做数据工程师回头看这套笔试题的每一个考点都在日常工作中找到了实实在在的落脚点。笔试只是第一道门真正拉开差距的是后续动手解决问题的习惯。准备笔试时多问几个“为什么”多写几遍代码跑通结果面对任何一套新题都能从容不少。