从业几年后再回头看,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基础与并发 | 选择题、简答 | 高 | 大数据框架大多基于JVM,JVM与并发是避不开的坎 |
| 数据结构与算法 | 编程题、思路题 | 高 | 校招筛选的通识项,考察代码基本功 |
| Hive SQL与数据仓库 | 手写SQL、场景设计 | 高 | 实习生入职后最日常的工作就是写SQL |
| Hadoop/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任务从提交到结束经历了哪些步骤:客户端提交Job,ResourceManager分配容器,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-小时”拼成key,value记为1;Reducer端直接遍历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,而是字符串模拟加法的能力。要注意进位和两个字符串长度不一致的情况,代码写完后一定要自己跑几个边界用例,比如“999+1”和“0+0”。
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,到实习、正式做数据工程师,回头看这套笔试题的每一个考点,都在日常工作中找到了实实在在的落脚点。笔试只是第一道门,真正拉开差距的是后续动手解决问题的习惯。准备笔试时多问几个“为什么”,多写几遍代码跑通结果,面对任何一套新题都能从容不少。