京东数据开发工程师笔试题解析:SQL数仓Hadoop核心考点
2026/9/6 10:28:00 网站建设 项目流程

不必绕弯子,直接说结论:这套京东2018秋招数据开发工程师笔试题,放在今天依然有很高的参考价值,尤其是准备大厂数据岗位面试的朋友,值得拿它做一次系统性自测。原因很简单——数据开发这个岗位的考察范围,这么多年核心框架没有变:SQL功底、数仓建模思维、Hadoop生态理解、Java与算法底子、以及把业务问题翻译成数据方案的能力。题目形态会变,但底层考察点高度稳定。

这篇文章不打算只把题干复述一遍。我按自己的理解,把这套题拆成几个能力维度,挑几道典型题目做完整拆解,再延伸一下从笔试到面试的备考路线。无论你是准备校招、跳槽,还是想验证一下自己的知识体系有没有短板,按这个思路走一遍会很有收获。

1. 这张卷子到底在考什么:拆解数据开发岗位的四大能力象限

先聊一个很多人会忽略的问题:数据开发工程师的笔试,看起来题目零散,其实每个板块都在精准地筛人。京东这套题,从整体结构看,主要落在四个象限里。

1.1 SQL和数据仓库:大题的主战场

SQL不是简单的“会不会写”,而是考察你在数据量爆炸的情况下,能不能写出正确且高效的查询。笔试里的大题,几乎清一色是SQL场景题:给你几张业务表,让你统计留存率、复购率、Top N、连续登录天数这类指标。

这类题表面考语法,实际考三件事:第一,你能不能看懂业务表结构,快速建立字段之间的关联关系;第二,你会不会用窗口函数、CASE WHEN、多表关联这些核心工具组合解题;第三,你的查询方案在数据量大的情况下能不能跑得动。

我当时复习时的一个感受是:前期刷题很容易陷入“为了写对而写对”,写完一提交,通过了就不再管了。后来发现这是个大坑——笔试判卷虽然看结果,但面试官面试时一定会追问“你这个SQL在大数据量下有什么风险”“还有没有更优写法”。所以准备的时候,每道题都该问自己一句:如果这张表有十亿行,我的写法还能不能撑住。

1.2 Hadoop生态:从背概念到画数据流

数据开发岗位笔试几乎必考Hadoop生态,但考察深度越来越偏向“理解原理”而非“背诵定义”。比如MapReduce的shuffle过程、Hive的架构、HBase的读写路径、Zookeeper的角色与选举机制。

背概念为什么不够用?因为笔试题目会换着花样考。一个常见问法是:给你一个业务场景,让你设计一套从数据采集到数据落地的完整流程,并说明每一步选型理由。这已经不是“什么是Hive”这种题了,而是考察你有没有真正理解每个组件能解决什么问题、瓶颈在哪里、组件之间怎么配合。

我的建议是,不用急着背几十个组件,先把一条主线理清楚:数据从哪里来(采集)——放在哪里(存储)——怎么处理(计算)——怎么服务业务(查询/OLAP)。每个环节的主流组件、核心原理、优缺点,以及组件之间的替代关系,这些理清了,大部分Hadoop生态的题都能应对。

1.3 Java与算法:容易被忽视的“内功”

数据开发工程师日常主要写SQL和Shell,但笔试偏偏喜欢考Java基础和算法题,原因很直接——大厂要筛出那些具备扎实编程底子的人,而不是只会套模板的“SQL boy”。

Java部分常考的知识点包括集合类源码原理(HashMap的put流程、扩容机制)、并发与多线程(synchronized与ReentrantLock的区别、线程池参数含义)、JVM内存区域划分与GC基本策略。算法部分则主要集中在数组、链表、字符串、二叉树、动态规划、排序这几个常规类别上。

很多数据方向的同学觉得算法是后端岗位才需要准备的,这是误解。笔试环节算法的占比可能不高,但只要出了一道,分值往往不小。而且根据我的经验,技术面、总监面都有可能出现手撕代码环节,算法不准备,后续面试会非常被动。

1.4 业务场景与数据建模思维

这是最容易丢分、也最考区分度的部分。京东是电商公司,它的数据场景天然丰富:用户、商品、订单、交易、物流、营销,每个环节都有大量经典分析需求。

题型通常是这样:给你一个业务问题(比如“分析近期某品类商品的销售情况”),让你结合可用数据、明确分析思路、设计指标体系、规划数据表结构。这已经超出了一道SQL题或者一道概念题的范围,它要求你具备数据产品思维——能理解业务方的真实诉求,能拆解问题,能落到具体的数据方案上。

我遇到不少基础很好的候选人,在这个板块丢分。原因是他们习惯做“给定表和需求,写SQL”的题目,一旦需求变成开放式的,就不知道从哪里下手。破解方法也很简单:平时多接触业务,多思考数据模型为什么这样设计,刷题时遇到开放题不要急着看答案,先自己写分析框架。

2. 几道值得反复咀嚼的原题,附带完整解析

题目的具体表述会因年份批次略有出入,但考察点高度一致。以下我用同类型的场景来还原,并给出完整解法思路。

2.1 经典SQL窗口函数题:连续登录N天的用户

场景是这样:有一张用户登录日志表login_log,包含user_id和login_date两个字段,要求统计连续登录3天及以上的用户数。再复杂一点的版本,会要求统计每个用户最长连续登录天数。

第一步要建立“每个用户每天只有一条记录”的假设,所以先对原始表按user_id、login_date去重,这一步很多人的答案漏掉,会直接导致结果错误。

第二步是核心技巧:对每个用户按登录日期排序,用日期减去排序序号,得到一个日期差字段。因为连续登录的日期差是相同的,不连续的日期差会跳变。再按user_id和日期差分组,统计组内记录数,就能得到每一段连续登录的时长。

能写出这个思路,说明你已经吃透了窗口函数和日期计算的配合。但一个更优的解法是用lag函数:通过lag(login_date, 1) over (partition by user_id order by login_date)构造上一行的登录日期,再判断当前日期与上一行日期的差值是否为1,标记出连续区间的断点。这种写法在理解上稍微绕一点,但在某些数据量极大的场景下,中间结果的行数会少很多。

我建议两个方法都掌握。笔试时用自己最熟练的,面试被追问时可以主动提一下“另一个方案是使用lag函数”,面试官会认为你确实理解多种解法的适用边界。

2.2 数据倾斜场景设计题:Reduce阶段不均衡

Hadoop/Spark场景题里,数据倾斜是最高频的考点。典型问法:跑一个join任务,其中一个表里某个key的数据量特别大,导致大部分数据都跑到同一个Reduce上,任务严重拖慢,你怎么解决。

这类题的常规解法有以下几个层级:

第一层,过滤异常数据。如果是业务上的脏数据或者无效数据(比如用户ID为空的记录),直接过滤掉,这一步往往能解决绝大部分倾斜问题。

第二层,加随机前缀。把倾斜的key打散,比如给倾斜key的值拼一个随机数(1到n),然后对另一个表的关联字段也做相应扩展,通过“膨胀”小表来实现数据分散。代价是计算量增加,但能有效避免单点压力。

第三层,两阶段聚合,也就是局部聚合加全局聚合。先给key加随机前缀做一次预聚合,去掉前缀后再做一次全局聚合。这个方法特别适合count、sum这类聚合型倾斜。

第四层,从源头优化。如果倾斜是Join引起的大key与小表关联,可以考虑将小表广播到每个节点,用MapJoin代替ReduceJoin,从根本上避免shuffle。

面试时不能只说一个方案,而是要说清楚:先定位倾斜发生在哪个阶段、倾斜的key是什么类型,然后根据不同原因选择不同方案。这才是考察的真正意图。

2.3 Hive全排序:order by与sort by的区别

SQL中order by很好理解,全表排序。但在Hive里,order by会强制走一个Reduce,全量数据在一个节点上完成排序,数据量一大基本跑不动。所以Hive里更常用sort by,它在每个Reduce内部排序,多个Reduce之间不保证全局有序。

有一个很经典的组合:distribute by + sort by。比如需要按日期分区输出且每个分区内有序,可以distribute by日期字段,sort by排序字段。这样每个日期对应的数据会进入同一个Reduce,并在该Reduce内完成排序,兼顾了效率与局部有序性。

笔试经常在这个点上设置陷阱:直接让你用order by实现全排序,然后问如果数据量达到TB级怎么办。如果基础不牢,很容易直接写上order by,完全没有意识到这个方案在大数据量下根本跑不起来。所以这类题的真实考察点,不是你能不能写出排序SQL,而是你知不知道Hive的底层执行机制。

再延伸一个点:如果只是去重,用distinct或group by都行,但数据量大的情况下,group by配合适当的分桶往往更高效,因为它天然可以并行去重。很多人在这类题目上失分,不是不会写,而是不知道不同写法在引擎内部执行路径差异很大。

2.4 Java基础与HashMap源码

数据岗笔试题Java部分最常见的一道题是:HashMap的底层数据结构是什么?put一个key-value时发生了什么?什么时候触发扩容?为什么容量是2的幂次?

底层数据结构:数组加链表,链表长度超过8且数组长度超过64时,链表会转为红黑树。put流程:先对key做hash,高低位异或后计算数组下标;如果有冲突,用equals比较key;相同就覆盖,不同就挂在链表或红黑树上。扩容机制:默认初始容量16,负载因子0.75,当元素个数超过容量乘以负载因子时,扩容为原来的2倍。

为什么容量必须是2的幂次?因为计算下标用的是(n - 1) & hash,只有当n是2的幂次时,n减1的二进制才是全1,hash值与它做位与运算才能均匀落在数组区间内,同时这个操作比取模运算更快。

面试官还可能追加追问:为什么不直接使用hashcode作为下标?因为hashcode是int类型,取值范围很大,无法直接映射到数组上,需要二次处理。这也是为什么需要先扰动(异或高低位),再位运算定位下标。

这些问题看着基础,但能深入讲透的人并不多。背会一个流程容易,能把每一步的“为什么”解释清楚,才算真正掌握。

3. 从笔试题延伸到面试环节,你还需要准备这些

笔试通过只是第一关,紧接着的技术面往往围绕笔试内容展开追问。很多候选人笔试分数不错,但一到面试就露馅。

3.1 简历项目与笔试知识点的对应关系

面试官拿到你的简历后,会挑一个你最熟悉的项目,然后层层深挖。但深挖的方向,往往和笔试知识点高度重合——你做完一个离线数仓项目,他一定会问:你的数据清洗怎么做?Hive调优做过哪些?数仓分层有哪几层?每层怎么划分?遇到过数据倾斜吗?怎么解决的?

所以在准备面试时,不要孤立地回顾项目,而要把项目的每一个技术决策都跟笔试知识点挂钩。比如简历里写了“使用Hive进行ETL”,就要准备好回答Hive执行引擎、分区与分桶的区别、小文件问题、UDF编写方法等延伸问题。

一个实用的准备方法:把你项目里用到的每一个组件列出来,再为每个组件写下3到5个常见的追问方向,逐条准备答案。这个过程能暴露大量知识盲区,比盲目刷题有效得多。

3.2 数据仓库维度建模必问清单

数仓建模是数据开发面试的核心面试点,也是笔试开放性大题常在的背景。面试官偏好考查维度和事实表的区别、星型模型和雪花模型的区别、缓慢变化维的处理方式。

维度表存储描述性信息,事实表存储度量值。星型模型适合查询性能要求高的场景,维度表直接与事实表关联,结构简单、冗余可控;雪花模型将维度表规范化拆分,减少冗余但会增加关联层级,查询性能相对下降。对于绝大多数业务场景,星型模型是首选。

缓慢变化维是另一个高频考点。最常用的是SCD2——在维度表里增加生效日期、失效日期、当前标识三个字段,历史记录和当前记录并存,能够完整追踪变化轨迹。但它的代价是下游取数逻辑变复杂,维度表数据量也会膨胀。很多人只记住了“SCD2能记录历史变化”,但答不出“什么业务场景适合SCD2,什么场景用SCD1就够”“维度表膨胀后的处理策略有哪些”,深度不够。

3.3 手撕代码的常见变形

手撕代码不必追求刷完上千道题,把高频类型练熟更重要。数据岗的算法题通常不会太难,LeetCode中等难度基本够用。重点放在以下几类:

数组与双指针类,比如两数之和、三数之和、合并两个有序数组;链表类,比如反转链表、判断是否有环、找中间节点;字符串类,比如最长公共前缀、无重复字符的最长子串;二叉树类,比如层序遍历、最近公共祖先;动态规划类,比如爬楼梯、最长递增子序列、背包问题原型。

写代码时注意几点:先和面试官确认输入输出与边界条件,再动手;写完不要急着说“OK了”,自己走一遍简单测试用例;最后用自然语言讲一遍你的复杂度和优化空间。很多候选人代码写对了,但因为只讲了“我是这么写的”,没有讲“为什么这么写”,分还是上不去。

3.4 开放题的回答思路

开放题在数据岗面试里几乎必出,比如:如果让你设计一个订单分析系统,你怎么做?或者:某品类销量下降,你会如何排查原因?

这类题没有标准答案,但有一个比较稳妥的回答结构:先明确问题边界,再拆解影响面,再给出数据方案,最后说明落地路径。

以“销量下降”为例:先限定品类、地区、时间范围;拆解影响因素,包括流量侧(曝光、点击、转化)、商品侧(价格、库存、差评)、渠道侧(活动、投放)、竞品侧;对应每个因素规划需要哪些数据;再基于数据仓库设计出指标看板或专题分析,定位真正的下降原因。

核心是结构化思维。答得简洁、层次清楚、能落地,比给出一个看似完美的方案更重要。因为面试官要的不是正确答案,而是你处理模糊业务问题的思维方式。

4. 备战这种笔试,按这个路线走比较稳

最后聊一聊备考路线,这部分是纯个人经验分享,不带通用模板的“权威性”,但都是我实际走下来觉得有效的方法。

4.1 时间分配建议

如果你的复习时间有四周,我的建议是这样分配:第一周重点过SQL和数据仓库理论,把所有常用窗口函数、聚合函数、表关联方式用熟;第二周集中刷Hadoop生态的基础原理,重点理解MapReduce、Hive、Spark的执行流程,不要只背概念;第三周补Java基础与算法,优先复习HashMap/HashSet源码原理、多线程基础,以及LeetCode高频题;第四周全身心投入到开放题和项目梳理,把简历里面每一个项目都写成可以应对深挖的版本。

这个顺序的逻辑是:SQL和数仓是立身之本,先解决;生态原理决定你能不能回答“为什么这么选型”,是区分度所在;Java和算法是隐性淘汰项,不能留明显短板;最后一周的开放题和项目梳理,是把前面所有知识点串联起来的关键。

4.2 我自己踩过的坑

第一个坑:刷SQL题时只看答案不练。早期我遇到不会的题就直接翻题解,看完觉得自己懂了,但到笔试现场稍微一变体就卡住。后来改成每个题目先独立思考30分钟,再对比题解,效果完全不一样。

第二个坑:背原理不画图。学MapReduce时把流程背得滚瓜烂熟,但面试官让我画一下数据流的走向,一下子就蒙了。原理类知识点一定要动手画图,把每个阶段输入输出画清楚,画过一遍才算真正理解。

第三个坑:不重视小文件问题。笔试时觉得自己把SQL写对就万事大吉了,完全没考虑生产环境里小文件过多导致NameNode压力、Spark任务调度变慢的问题。现在只要涉及Hive表设计,我都会主动提一下文件格式、压缩方式、小文件合并策略,这个意识在面试中非常加分。

第四个坑:临时抱佛脚准备系统设计题。数据开发面试很可能会问到“你怎么设计一个数据平台”这类系统设计题,如果只是临时背几篇面经,很难把存储、调度、计算、服务几个环节讲顺。建议提前画一版自己理解的数据平台架构图,并把每个环节的选型理由想清楚。

4.3 实用资源与自测方法

SQL练习方面,除了常规的刷题网站,强烈建议自己造数据练手。可以设计一个简单的电商模型,自己造几张表(用户表、订单表、商品表),把销售分析、留存分析、复购分析这些常见需求全部写一遍SQL。这个过程非常贴近真实工作。

原理学习方面,Hadoop生态不需要抱着厚重的书啃,先看官方文档的核心篇,或者直接看各个组件的架构设计类文章,抓住“组件解决什么问题、核心架构是什么、关键流程有哪些”这几个点即可。

算法方面,建议按标签集中刷题,而不是随机乱刷。每天一类,比如今天只做链表、明天只做二叉树。控制在这个强度,两周就能覆盖大部分高频考点。

最后提供两个自测方法:一是限时模拟,给自己一次性做完整套题,严格卡时间,检验自己在笔试状态下的真实水平;二是讲题复述,把你做过的每道题,用口述的方式讲给朋友听,或者对着录音讲,如果讲不出来,说明你还没有真正理解。这个方法尤其适用于SQL题和数仓建模题。

准备数据开发岗位的笔试和面试,本质上是一个把零散知识点织成网的过程。单个知识点不难,难的是当你面对一道综合题时,能不能快速定位它考的是哪几个点、它们之间如何联动。京东这套题的价值就在于覆盖面广、贴近业务、深度和广度兼顾。如果你能把本文提到的几个维度全部吃透,再借这套题做一个自我检验,我相信你会对自己的状态有一个非常清晰的认识。

最后再分享一个我的切身体会:不要只盯着“通过笔试”这个目标。真正让你在后来的面试中脱颖而出的,往往是那些你为了通过笔试而认真研究过的“为什么”。对每一个关键知识点多问一句“为什么”,再深挖一层,这既是一种备考策略,也是数据开发这个职业本身最需要的能力。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询