ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

浩鲸科技数据开发B卷笔试复盘:SQL与数仓核心考点全解析

浩鲸科技数据开发B卷笔试复盘:SQL与数仓核心考点全解析 1. 浩鲸科技数据开发岗B卷给人的第一印象1.1 为什么数据开发岗笔试要单独设B卷每年校招季浩鲸科技这种体量的公司都会收到海量简历笔试环节是他们做初筛的重要手段。我当年投递的时候招聘官网把技术岗笔试分成了A卷、B卷实际上是因为投递量大、考场时间分散需要多套试卷防止泄题同时也方便不同批次的笔试轮次使用。数据开发这个岗位单独成卷而不是和Java开发、前端开发共用一张卷这一点很关键说明岗位需求和通用后端开发是有明确区分的。A卷和B卷在难度上通常没有本质差别B卷并不是所谓的“补考卷”或者“简单卷”。真正的情况是两套卷子的考点覆盖范围基本一致但题目的排列顺序、部分选择题选项、SQL场景的具体业务背景会不同。比如A卷可能考电商订单表去重B卷就可能考运营商话单表去重思路一模一样只是换了层皮。这一点在备考时很重要不要纠结自己拿到的是哪套卷而要把数据开发岗位的常见考点全部过一遍。数据开发这个岗位在浩鲸这样的公司里主要服务于运营商BSS/OSS系统、智慧城市、交通大数据等项目。笔试考察的核心其实是在回答一个问题你愿不愿意踏实做数据加工、数据治理、指标体系这些脏活累活并且具备把需求转化成SQL和调度任务的能力。明白这一点你就知道备考重点应该放在SQL、数据仓库建模、大数据组件基本原理这些方向而不是死磕算法。1.2 开考后会遇到什么时长、题型与答题策略浩鲸科技2020届数据开发B卷的笔试形式是线上笔试用的是牛客网那套系统我记得时长是90分钟题量在40题上下。时间看上去不少但考虑到里面有3道左右的编程题90分钟其实挺紧张。线上笔试最大的问题是你没法像在纸上一样随手画图SQL题也不能像IDE里那样边跑边调逻辑完全靠脑子推演。题型分布大概是这样的客观题选择题为主25道左右覆盖Java基础、数据结构、计算机网络、Linux命令、数据库原理。简答题2道左右通常是数据仓库建模思路、某个大数据组件的工作原理。SQL编程题2-3道考察多表关联、窗口函数、去重、分组聚合等。算法编程题1-2道难度在LeetCode中等偏下。我印象比较深的是B卷的选择题里有好几道是直接给一段Java代码问输出结果的题还嵌套了String常量池、Integer缓存这些知识点。这些题如果平时只写SQL、很少碰Java确实容易懵。但这恰恰说明一个事实数据开发岗不是只会写SQL就行Java和JVM基础是必考的。答题策略上我的建议是先做编程题再做SQL题然后做简答题最后快速击破选择题。原因很简单编程题和SQL题分值高、区分度大而且做出来就是做出来了不存在蒙对的运气成分。选择题就算时间不够也能靠直觉选个答案。我当时是先扫了一遍所有题目把编程题的难度在心里排了个序然后直接开写。2. B卷题型拆解每个模块到底在考什么2.1 客观题Java、数据结构、网络与LinuxB卷的客观题考察范围很杂但仔细看还是有规律的。先说Java基础我遇到的知识点集中在String、集合类、异常处理、多线程基础这四个方向。有一道题是问String s1 abc; String s2 new String(abc); s1 s2的结果是什么这种题属于经典的送分题考的是常量池和堆内存的区别。还有一道考察HashMap底层实现的题问JDK1.8之后链表转红黑树的阈值是多少答案是8。这类题不需要深度源码分析但基本概念必须清楚。数据结构部分考了栈和队列的区别、二叉树遍历方式、排序算法的稳定性和时间复杂度。有一道题问快速排序在最坏情况下的时间复杂度是多少这个只要背过答案是O(n²)就能答对但题目换了个问法——给出一个序列问哪种排序算法最不适合该场景这就需要在理解的基础上作答了。备考的时候建议把常见排序算法的时间复杂度、稳定性、适用场景整理成一张表反复看几遍。计算机网络考得不多大概3道题以内。TCP三次握手的作用、HTTP和HTTPS的区别、DNS解析过程这几个知识点出现的频率最高。这类题对于数据开发来说属于常识性内容不需要深入TCP拥塞控制那些细节但三次握手、四次挥手这些基础流程还是要知道的。Linux命令是很多非科班同学容易忽略的点。B卷里考了grep、awk、sort这几个命令的用法其中有一道题是给一个日志文件问用什么命令能统计出某个字段的Top 10。这道题本质上就是在考察你平时操作大数据集群会不会用Linux管道命令处理文件。会的人一眼看出用awk {print $N} | sort | uniq -c | sort -rn | head -10就能解决不会的人只能干瞪眼。2.2 简答题大数据组件与数据仓库建模简答题在B卷里是拉开差距的关键。有两道题我印象很深刻。一道是问“Hive和传统关系型数据库的区别”这道题看似简单但拿满分的要点在于回答维度要全。可以从存储位置、数据更新、索引、执行引擎、延迟、扩展性这几个方面展开对比。只写“Hive是跑在大数据上的SQL”这种回答肯定拿不到高分。另一道是数据仓库建模相关的题问“什么是星型模型和雪花模型各有什么优缺点你倾向怎么选”。这道题考察的是你实际项目的经验和对建模原理的理解。我当时答了星型模型查询效率高、表结构清晰、冗余多但易理解雪花模型范式化程度高、冗余少但查询需要多层关联性能有损耗。最后补充了一句在数据量大的数仓环境里我倾向优先用星型模型必要时对维度表做适度冗余。这种回答有观点、有理由比单纯罗列定义好很多。这类简答题的备考方式没有捷径只能把Hadoop生态常用组件HDFS、MapReduce、Hive、Spark、Flink、Kafka的原理和适用场景都过一遍再把维度建模理论搞懂。尤其是维度建模里的事实表、维度表、渐变维度、退化维度这些概念几乎是数据开发面试笔试的必考内容。2.3 编程题算法与SQL的配比逻辑B卷编程题给我的整体感受是算法题不难SQL题更贴近实际工作。算法题考了类似数组去重和Top K的类型不需要复杂的数据结构但边界条件容易出错。SQL题考的是用户留存和连续登录这类经典场景平时刷过牛客SQL题库的人应该觉得友好。这里想多说一句数据开发岗位的算法题考察的强度明显比Java开发岗低。Java开发可能要考动态规划、二叉树各种遍历数据开发通常只需要掌握数组、字符串、哈希表、排序、双指针这些基础内容。原因也很好理解实际工作中数据开放的核心能力是处理数据的逻辑而不是设计精巧的算法。但不是说算法可以不准备至少两数之和、反转字符串、Top K这些高频题要能秒写出来。SQL编程题才是数据开发笔试的重头戏。连续登录、分组TopN、行列转换、同比环比、留存率这些场景基本是各个公司笔试的常客。备考方法就是把牛客和LeetCode上的SQL困难题全部刷一遍重点不是记答案而是熟练使用窗口函数尤其是ROW_NUMBER()、RANK()、DENSE_RANK()、LAG()、LEAD()、SUM() OVER()这些的语法和适用场景。3. 数据开发笔试的硬核SQL与数据仓库考察细节3.1 窗口函数是必考的但难点在翻译题意我在B卷里遇到的第一道SQL题大概是这样有一张订单表包含用户ID、订单金额、下单时间题目要求找出每个用户下单金额最高的前三笔订单。这道题最直接的解法就是窗口函数SELECT user_id, order_amount, order_time FROM ( SELECT user_id, order_amount, order_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_amount DESC, order_time ASC) AS rn FROM orders ) t WHERE t.rn 3;窗口函数大家都会写但笔试里真正容易丢分的地方是题意的转化。比如这道题如果要求“每个用户下单金额排名最高的前三笔订单且金额相同按时间最早优先”那ORDER BY子句的排序规则就必须写对——先按金额降序再按时间升序。如果没注意“时间最早优先”这个条件直接按金额排序测试用例就会挂掉。还有一类坑出现在“连续”问题上。比如有个常见题是“求连续3天有购买记录的用户”很多人一看到连续就想用自关联结果写了半天还容易漏数据。其实这类题用ROW_NUMBER()生成连续编号然后用日期减去编号判断是否得到同一个日期就很好解。笔试现场时间紧平时一定要把这类题的套路练熟才能在考场上快速反应。3.2 数据仓库分层与拉链表考察思路的经典类型B卷简答题里让我印象很深的一道题是“请描述一个数据仓库的分层架构以及每层的作用。”这道题不是给你一个具体表结构而是考察你有没有真正做过数仓项目还是只停留在背概念的阶段。我当时答的是经典的ODS、DWD、DWS、ADS四层架构。ODS层负责把业务系统的原始数据同步进来不做太多加工DWD层做清洗、去重、维度退化形成明细数据DWS层面向业务主题做轻度汇总比如按用户、按地区预聚合ADS层是应用层服务报表和数据产品。这个回答本身不难但如果能加上自己对每层分层的理由比如“DWD层为什么要做维度退化因为可以减少下游查询时的多表关联次数”就会比单纯列层级的答案更出彩。拉链表也是数据开发笔试的高频考点。问法通常是“如果事实表里的数据是全量快照而你希望保留每个用户每一天的最新状态同时保留历史变更记录你会怎么设计这张表”。拉链表的思路就是增加start_date和end_date两个字段每条记录代表某个状态的有效期。笔试中如果考到拉链表大概率会让你写一条SQL从每天的全量数据更新到拉链表里。核心逻辑是先关链再开新链实际操作要用到LEFT JOIN和UNION ALL。这道题能现场写对的人不多但只要提前准备过就是稳稳的得分题。3.3 一道让我印象深刻的SQL题复盘B卷里有一道题我至今记得很清楚它是关于行列转换的。表结构是产品ID、月份、销售额每个产品每个月一行记录。题目要求输出每个产品每个季度的销售总额列是季度行是产品。也就是要把月份转成列。我当时用的是CASE WHEN加条件聚合SELECT product_id, SUM(CASE WHEN month IN (1,2,3) THEN sales_amount ELSE 0 END) AS q1, SUM(CASE WHEN month IN (4,5,6) THEN sales_amount ELSE 0 END) AS q2, SUM(CASE WHEN month IN (7,8,9) THEN sales_amount ELSE 0 END) AS q3, SUM(CASE WHEN month IN (10,11,12) THEN sales_amount ELSE 0 END) AS q4 FROM sales GROUP BY product_id;这道题的考点很直白一考你是不是知道条件聚合这种写法二考你对GROUP BY后SELECT字段受不受限制的掌握程度。这里有个细节在GROUP BY product_id的情况下month和sales_amount不能直接出现在SELECT里必须用聚合函数包裹CASE WHEN就是起到条件判断和值筛选的作用。如果你不知道这层关系急着先SELECT month再GROUP BY很容易写出语法错误的SQL而且你自己还查不出来。踩完这个坑之后我总结了一个心得笔试中的SQL题不需要你写出最优美的执行计划但要求你的结果绝对正确。所以不要一味追求“一条SQL解决所有问题”的炫技步骤拆开写临时表中间结果多算几步只要最终结果对照样拿分。线上笔试系统不会对你的SQL做执行效率打分它只看结果集和预期结果是否匹配。4. 大数据框架与Java基础那些容易被忽视的得分点4.1 Hive与Spark的考察边界浩鲸这种体量的公司数据开发岗位笔试题里出现Hive和Spark的大题并不意外。B卷虽然没有专门出一道“请简述Spark任务提交过程”这种开放式大题但选择题里有不少Hive和Spark相关的小题。Hive的考察重点是Hive和MySQL的对比、内部表和外部表的区别、分区表和分桶表的创建方式、Hive SQL和传统SQL的语法差异。其中内部表和外部表那道选择题很经典问“删除内部表和外部表时HDFS上的数据分别会发生什么变化”。答案是内部表删除时元数据和HDFS数据一起删除外部表只删除元数据HDFS上的数据还在。这个概念如果不清楚生产环境里一个DROP TABLE就能把底层数据文件删掉代价非常大。Spark的考察相对基础主要是Spark的几种运行模式、RDD和DataFrame的区别、宽依赖和窄依赖的概念。我遇到一道题问“以下哪个算子是宽依赖”选项里给了map、filter、groupByKey、union。答案是groupByKey因为它涉及数据洗牌需要跨分区重分布。这种题只要理解依赖分类的原理不靠死记硬背也能做对。这里我要提醒一句数据开发笔试对Spark的考察通常不会深入到源码级别但你要知道Spark在内存计算方面比MapReduce强在哪里、RDD的惰性计算到底是什么。能把“行动算子触发真正计算”这一点用大白话讲清楚简答题就够用了。4.2 JVM与并发数据开发也要掌握的Java基础很多人以为数据开发就是写SQL和ETLJava可以放一边。但浩鲸的笔试明确告诉你不行。B卷里Java的题占比不小而且不是那种“判断题”、“问基本语法”的送分题而是有一定难度的基础题。我记得有一道题问“HashMap在多线程环境下会有什么问题”选项里有一个是“JDK1.7版本可能在扩容时形成循环链表导致死循环”这个考点非常经典。数据开发平时在写Spark任务时虽然不直接写HashMap但理解这些并发问题的本质其实有助于你理解分布式计算里的数据一致性难题。JVM的考察集中在内存的区域划分和GC机制。有一道选择题问“以下哪个区域不会发生OutOfMemoryError”选项分别是堆、虚拟机栈、本地方法栈、程序计数器。答案是程序计数器因为它是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。这种题如果没系统学过JVM很容易靠猜。我建议非Java背景的数据开发同学备考时花两天时间专门补一下JVM内存模型、类加载机制、常用集合类的底层实现、多线程基础这把几个方向。不需要刷源码但百度能搜到的经典面试题要能说出个一二三来。毕竟无论是Hive的HQL编译还是Spark的Driver端和Executor端通信底层都离不开Java的并发和内存机制面试官出这些题是想看你有没有从原理上理解大数据框架的可能性。4.3 Linux命令与Shell笔试中的隐藏送分题Linux题在B卷里大概3到5道但往往是很多人不重视却实际上最好拿分的题。数据开发的实际工作流程就是登录集群、跑SQL、看日志、调任务你要是连tail、grep、scp都不会用那确实不太像能干这个岗位的样子。B卷里有一道Shell相关的题我印象很深是给一段脚本让你推测它执行后的输出for i in $(seq 1 3) do echo number: $i done这个简单答案是输出三行number: 1、number: 2、number: 3。真正容易出错的是如果脚本里写的是for i in {1..3}有些系统里的sh可能不支持这个语法但笔试一般不会考到这么边缘。常见的考点是变量引用、条件判断、循环、管道、重定向这些。还有一个高频考点是crontab的配置规则。选择题里可能会给你一个需求“每分钟执行一次脚本”然后让你选正确的写法。答案是* * * * *这个很简单。但如果是“每天凌晨2点执行”正确答案是0 2 * * *。只要你把分 时 日 月 周这个顺序记住这类题就是纯送分。数据开发虽然不会让你天天配crontab但很多离线任务调度要么用公司的调度平台要么直接在生产机上配crontab知道这些基础可以让你第一个月实习期不那么心虚。5. 算法编程题实战复盘从读题到AC的完整链路5.1 Top K问题最典型的考察点B卷算法题里有一道Top K问题具体题目记不太清了大致是“给定一个整数数组找出其中出现频率最高的K个数”。这道题有三个常规解法一是用HashMap统计频次再排序二是用最小堆维护Top K三是用快速选择算法。笔试环境下最优解是第二种因为它时间复杂度和代码复杂度平衡得很好。我当时的思路是先用HashMap统计每个数的频次然后用一个大小为K的最小堆逐个加入元素当堆的大小超过K时弹出堆顶这样最终堆里留下的就是频次最高的K个元素。对应Java代码大概是public ListInteger topKFrequent(int[] nums, int k) { MapInteger, Integer count new HashMap(); for (int num : nums) { count.put(num, count.getOrDefault(num, 0) 1); } PriorityQueueInteger heap new PriorityQueue( (a, b) - count.get(a) - count.get(b) ); for (int key : count.keySet()) { heap.offer(key); if (heap.size() k) { heap.poll(); } } ListInteger result new ArrayList(heap); return result; }写完这道题之后我复盘了一下容易丢分的位置一是忘了处理边界条件比如数组为空或者k等于0的情况二是比较器写反了导致堆里保留的是频次最小的元素而不是最大的。这两个坑都很低级但线上笔试环境容易紧张出错。5.2 字符串处理题注重边界条件的解法B卷还考了一道字符串去重相关的题具体是“给定一个字符串删除字符串中所有重复的字符顺序保持不变并输出去重后的结果”。比如输入abacabad输出abcd。这类题本身不难用HashSet就行但笔试里隐含的考点是你不能打乱原有字符的相对顺序同时去重。还有个容易错的点是字符串里有可能是大写字母、小写字母和数字混在一起如果用数组做字符计数要明确字符的取值范围。我当时用的解法是public String removeDuplicates(String s) { if (s null || s.length() 0) { return ; } SetCharacter seen new HashSet(); StringBuilder sb new StringBuilder(); for (char c : s.toCharArray()) { if (seen.add(c)) { sb.append(c); } } return sb.toString(); }这个解法核心思路是HashSet.add()的返回值如果字符之前没出现过返回true就把字符拼到结果里如果已经出现过返回false就跳过。代码写起来很简单但真正的得分点在于你是不是能迅速判断出用HashSet并且处理了空字符串的边界情况。很多人在笔试中容易犯的错是没判断s null就直接调用s.length()线上编译就直接空指针异常了。5.3 我的做题节奏和错误复盘动笔之前我给自己定了两条规则第一条读题超过三分钟还没有思路的题先跳过第二条每道编程题写完必须手动跑一遍边界测试哪怕只用脑子跑。当时我大概是这样分配90分钟的前5分钟把所有题目浏览一遍中间50分钟做编程题和SQL题后面20分钟做剩下的选择题和简答题最后留下10分钟检查。实际执行中发现最大的问题不是题不会做而是审题太快导致理解偏差。我记得有一道SQL题要求“统计每个用户最近一笔订单的金额”我第一反应是直接SELECT user_id, MAX(order_time)结果想出的是每个用户的最近下单时间而不是订单金额对应的那条记录。这类题正确解法是用窗口函数或者自关联先找到每个用户的最新时间再拿这个时间去关联订单表取出金额。笔试之后我复盘过这道题丢分的原因不是不会写窗口函数而是没耐心把题读完就开始写答案。建议所有备考的人在平时刷题时就养成一个习惯把题目的每个条件用笔圈出来尤其是“最”、“每个”、“最近”、“最早”这些限定词。线上笔试虽然没有纸笔但你可以把题目复制到记事本里把限定条件高亮出来多看几眼再动手。6. 从B卷反推备考重点给后来者的建议6.1 数据开发笔试的备考优先级排序经历过浩鲸B卷之后我自己总结了一套数据开发笔试的备考优先级。排第一的是SQL特别是窗口函数、多表关联、分组聚合、行列转换、连续问题、留存计算这些高频场景。SQL题的分值高、范围固定是投入产出比最高的一块。排第二的是数据仓库理论分层架构、星型模型和雪花模型、事实表和维度表、拉链表这些概念要能默写、能画出图、能举例子。排第三的是大数据组件原理HDFS读写流程、Hive架构、Spark的RDD和依赖关系、Kafka的消息模型这些都是简答题和概念题的来源。排第四的是Java基础和JVM主要刷集合类、String、异常、多线程、JVM内存模型这些基础题。不要追求源码深度但概念必须准确。排第五的是算法数据开发岗的算法题难度普遍不高重点刷数组、字符串、哈希表、双指针、Top K这些问题就行。如果你时间充裕可以再把排序算法和链表题过一遍。最后才是Linux基础这部分虽然考得不多但属于送分题不能丢。6.2 刷题之外的隐性准备笔试不仅仅是做题能力的比拼还包括环境适应能力。我强烈建议在正式笔试前用牛客网的模拟笔试功能做一次全真模拟提前习惯线上编译器、不能随便切浏览器页面、代码报错只能用眼睛看这几件事。我身边有同学就是平时在IDE里写代码习惯了第一次线上笔试连输入输出怎么写都想了半天最后时间完全不够用。另外一个非常容易被忽略的事情是考前把笔试题型的分布搞清楚。不同公司差别很大有的公司笔试里只有选择题有的公司SQL题占比特别高。浩鲸的B卷里是有简答题的这意味着你需要在90分钟里一边快速做选择题一边留足精力组织简答题的语言。如果平时不练习简答题现场很容易写出“Hive就是一个数据仓库工具”这种只有一句话的回答一分都拿不全。6.3 关于B卷与A卷的差异处理策略最后聊聊A卷和B卷的选择策略。正式笔试前我看到很多人在论坛上问“A卷和B卷哪个简单”说实话没必要纠结。B卷不是用来为难人的也不是A卷的替换版本它和你最终的面试机会没有太多关系。与其猜测自己拿到哪套卷子不如把两套卷子可能覆盖的交叉考点全部复习到位SQL基础语法、大数据组件原理、Java基础、数据仓库建模理论这四个方向不管哪套卷都逃不掉。如果硬要说B卷相对A卷有什么细微差别我个人的感受是B卷的SQL题多了业务背景的描述。A卷可能直接给你一张表告诉你字段B卷则会把表包装成“用户登录日志表”“订单支付流水表”这种带有业务含义的形式需要你先理解业务场景再写SQL。这种差别其实考察的是你在真实工作中从业务需求到技术实现的转化能力。面对这种情况最有效的应对方式就是平时多看一些数据产品、运营分析相关的文章养成“拿到一个业务问题先想清楚口径再动手”的习惯。我到现在还记得B卷简答题里有一道关于数据质量的问题“如何保证数据仓库中数据的准确性”。这道题我当时回答得不算好只列了数据校验、任务重跑、监控告警几个点没有把真正生产环境里的做法说出来。后来在实习中我才知道实际情况下大家会做上游数据漂移监控、主键唯一性校验、记录数对比、字段空值率统计等一系列手段。如果备考时能提前准备这些真实落地的方案答出来的内容会好得多。希望后来者看到这篇文章的时候能少走我走过的这些弯路。
返回列表