恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

蘑菇街数据仓库笔试题解析:维度建模与订单分析实战

  • 首页
  • 资讯中心
  • /
  • 蘑菇街数据仓库笔试题解析:维度建模与订单分析实战

相关资讯

Linux下部署StrykerOSS对象存储:安装、初始化与systemd托管指南 2026/8/31 9:48:35
大疆ROMO2:无人机感知技术下放地面,打造智能家居巡检机器人 2026/8/31 9:48:35
超级机器人大战Z模拟器配置指南:PCSX2与PPSSPP高效优化教程 2026/8/31 9:48:35

最新资讯

30 分钟跑通 LocalAI:本地部署第一个 OpenAI 兼容大模型
Umi-OCR 使用指南:免费离线 OCR 软件,截图、批量、PDF 识别一次讲清
Pilot Shell /setup-rules 12阶段深度解析:自动为代码库生成AI上下文
HyperMesh 2019视频教程:从几何清理到网格划分的完整前处理主线
为Codex打造一个实时跟踪任务状态的悬浮窗
抓包实战:让偷偷上报数据的“小猫咪”现出原形

今日推荐

MCU无DAC如何用定时器+DMA 2D输出高保真任意波形
Cortex-M3 Flash下载失败?从编程错误标志到供电瞬态排查
STM32 TouchGFX屏幕切换Transition优化:原理、配置与排障实战

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

蘑菇街数据仓库笔试题解析:维度建模与订单分析实战

发布时间:2026/8/31 9:48:35
蘑菇街数据仓库笔试题解析:维度建模与订单分析实战 大概每个做过数据仓库校招笔试的人都跟这套题打过照面。蘑菇街2019届实习生招聘里那套数据仓库开发工程师笔试题放在今天看依然是很有代表性的考察样本不偏不怪但很考验你对数仓基础的理解是不是真的通透。这套题的核心考点集中在用户订单分析场景下的维度建模、事实表设计、SQL基本功和ETL思维正好是数据仓库开发岗日常工作的四个主要方面。无论你是准备校招笔试还是刚转行入坑数仓把这套题的解题思路梳理清楚比单纯刷题要有价值得多。提示本文围绕“蘑菇街2019届实习生-数据仓库开发工程师笔试试题”展开结合数据仓库面试题常见考点重点拆解用户订单分析场景下核心维度表和事实表的设计思路与笔试答题策略希望对正在准备数据仓库相关岗位面试的同学有帮助。1. 数据仓库开发岗笔试到底在考什么1.1 校招笔试的真实定位先说个很多人容易误会的事。校招笔试不是拿来考“你会不会写代码”的它的核心目的是在一批简历看起来差不多的候选人里快速筛出那些真的理解数据仓库、而不是只会背概念的人。蘑菇街这套实习生笔试题也是这样表面上看着是几道设计题加几道SQL题实际上每道题都在考察你的数据建模思维是否成型。一套合格的数据仓库笔试题目通常围绕四个能力维度展开基础理论维度建模、事实表与维度表区分、范式与反范式设计能力给定一个业务场景能否独立完成核心维度表和事实表设计SQL能力窗口函数、多表关联、去重统计、留存计算等常用场景工程思维ETL流程设计、数据质量保障、任务调度与性能优化蘑菇街这套题基本把上面四块全部覆盖了而且重点放在前两块。这也跟实习生岗位的实际工作定位相关毕竟实习生入职后前几个月做的事大概率是在已有数仓体系里写ETL、做报表开发能独立从零设计一套数仓模型的机会反而不多但笔试必须考因为这能看出你有没有建模的底层思维。1.2 用户订单分析为什么是高频场景数据仓库面试题里用户订单分析几乎是必考场景原因很简单电商、新零售、本地生活这类业务核心数据链路都是围绕用户下单展开的。订单数据天然具备事实表和维度表的完整结构买家、商品、店铺、类目、时间这些维度非常清晰订单金额、商品数量、优惠金额这些度量也很明确非常适合拿来考察候选人的建模能力。更关键的是用户订单分析场景能延伸出大量真实业务问题GMV统计、客单价计算、用户复购率、订单取消率、品类销售排行等等。这些问题同一个订单明细表就能覆盖但不同的分析需求对表的设计要求完全不同这就考察你能不能在设计阶段就充分考虑后续的分析扩展性。我之前帮人改过很多份简历上的数仓项目十份里有八份写的是订单分析但能把事实表和维度表设计逻辑讲清楚的不到三分之一。大部分人的简历写的是“搭建用户订单分析数仓”你真要追问他订单事实表的粒度是怎么定的、用户维表用SCD1还是SCD2、时间维表是按天还是按小时切分他就开始含糊了。蘑菇街这套笔试题好就好在它把这些问题都直接出成了题目逼着候选人把话说清楚。2. 数据仓库核心理论考点梳理2.1 维度建模的两大基石事实表与维度表先过一遍最核心的概念因为笔试题再绕最终都会落回到这两个基石的辨析上。事实表记录业务过程产生的可度量事件每一行代表一个业务事实比如一笔订单、一次支付、一次退款。维度表则是描述业务事实所处环境的属性集合比如谁买的、买了什么、在哪个渠道买的、什么时间买的。这两类表有几个非常关键的区别笔试经常换着法子考对比项事实表维度表核心内容可度量的数值指标金额、数量、次数描述性文本属性名称、类目、地区数据量大持续增长通常按天分区相对小变化频率低主键无自然主键常用组合键或代理键自然主键或代理键更新方式新增为主基本不做修改缓慢变化需要SCD策略设计目标记录“发生了什么”描述“在什么环境下发生的”这个表建议刻在脑子里。笔试里很多设计题你只要先说清楚事实表和维度表的定位后面的设计自然就顺了。我在面试别人的时候最常问的一个问题是“订单金额应该放在事实表还是维度表”很多人第一反应是“有金额肯定放事实表”但如果你追问一句“那商品的历史价格信息呢”有的人就开始犹豫了。这里其实没有绝对正确答案关键是你能不能意识到金额是度量值是可加、半可加还是不可加以及不同分析场景下对金额的统计方式有什么差异。2.2 星型模型与雪花模型的取舍逻辑笔试题里经常让候选人对比星型模型和雪花模型或者给一个业务场景问选择哪种模型更合适。这个考点看起来简单但拿到分的关键在于你得把“为什么”说清楚而不是只罗列区别。星型模型的优势是查询性能好、结构简单、易于理解。事实表在中间维度表像星星一样围绕在四周每张维度表都是单层的不做层级拆分。比如商品维度表里直接冗余类目名称、一级类目ID、二级类目ID而不是把类目单独拆成一张表再关联。这样做的代价是数据冗余但换来的好处是减少了查询时的JOIN次数。雪花模型则是对维度表做了规范化拆分把层级关系拆成多张表。比如把类目拆成一级类目表和二级类目表商品表里只存二级类目ID查询的时候需要多JOIN一层。优势是数据冗余小、一致性更有保障但代价是查询性能和开发复杂度。我个人的经验是在互联网业务场景下星型模型是绝对的主流。原因也很直白数仓的数据量级很大查询链路每多一层JOIN性能损耗都是指数级的而且业务方用BI工具做自助分析的时候星型模型更友好业务人员也好理解。蘑菇街这套笔试题如果出现模型选型的题目默认优先答星型模型然后把雪花模型作为补充说明分析两者的适用场景基本就能拿到大部分的分数。2.3 缓慢变化维的三种常见策略维度表的数据不是一成不变的比如用户改了收货地址、商品换了所属类目、店铺改了名称这些都是维度属性的变化。如何处理这些变化就是缓慢变化维SCDSlowly Changing Dimension的核心问题。SCD1直接覆盖原值不保留历史。适合对历史数据不敏感的维度属性比如用户手机号当然严格来说手机号也可能是需要留痕的看业务要求。实现简单但历史数据会丢失。SCD2保留完整历史版本。当维度属性发生变化时新增一条记录并记录生效时间和失效时间通过flag标记当前生效版本。适合需要追溯历史的属性比如商品的类目归属、用户的会员等级。SCD3保留上一次的值。新增一列存原始值在原列上更新为新值适合只需要对比最近一次变化的场景。这种策略用得较少但在某些特定分析中很实用。笔试里容易踩的坑是遇到“用户维表设计”就直接写SCD2也不分清楚哪些字段需要保留历史、哪些不需要。正确的做法是先列清楚用户维表需要存储哪些属性再逐个判断属性变化对业务分析的影响程度。比如用户性别这种几乎不变的属性用SCD1就够了用户收货地址这种经常变、且对订单分析有影响的属性可以用SCD2用户渠道来源这种偶尔变化但分析时可能需要对比的属性可以考虑SCD3。注意SCD2虽然功能强大但会显著增加维表的行数和查询复杂度每个变化都会产生新版本记录。设计时要设定好保留历史版本的数量上限或者通过定期归档来压缩历史版本避免维表无限膨胀。我们实际生产环境里的用户维表就做过一个基于过期时间自动归档的清理任务。3. 用户订单分析场景核心维度表与事实表设计实战3.1 业务需求先拆解订单分析到底要回答哪些问题蘑菇街这套笔试的核心设计题大概率会给你一个用户订单分析的背景让你设计核心维度表和事实表。大部分候选人拿到这个题就开始画表结构这是不对的。正确的第一步是先拆解业务需求搞清楚这数据分析出来是给谁看的、要回答什么业务问题。用户订单分析最常见的几类问题整体经营分析今日/本周/本月的GMV、订单量、客单价、支付转化率用户行为分析新老用户占比、复购率、人均订单数、高频用户画像商品销售分析品类/单品销售排行、库存周转、爆款/滞销分析渠道效果分析各渠道带来的订单量、金额、转化率对比地域分布分析省份/城市的订单量、金额分布这些问题看起来很多但归纳下来核心就两个分析视角一是按时间维度向下钻取年-月-日-小时二是按业务维度用户、商品、店铺、渠道、地域进行切片。这两个视角直接决定了维度表的字段设计和事实表的粒度选择。我之前做一个跨境电商的订单分析数仓项目时早期没有想清楚需求把订单事实表粒度做成了“订单商品”明细级结果报表端大量需求是按订单级统计的每次都要先聚合一次不仅慢而且取数逻辑容易出错。后来把事实表拆成订单级和订单明细级两张问题才真正解决。这个经验放在笔试里也一样适用先想清楚分析需求再定粒度顺序不能反。3.2 核心维度表设计用户、商品、时间、店铺在用户订单分析场景中核心维度表主要有四张用户维度表、商品维度表、时间维度表、店铺维度表如果业务涉及多店铺。下面逐一说明设计要点。用户维度表dim_user字段名字段说明设计说明user_id用户ID业务主键user_name用户昵称展示用属性gender性别SCD1覆盖即可age_group年龄段派生属性可定期刷新register_date注册日期用于新老用户分析register_channel注册渠道用户来源分析关键字段membership_level会员等级变化频繁考虑SCD2last_login_date最近登录时间活跃度分析扩展字段商品维度表dim_product这个表要特别注意类目层级和商品属性的处理。类目层级建议冗余到商品维表中而不是单独拆类目表这样查询时少一层JOIN、性能更好这就是前面说的星型模型思路。商品属性中品牌、价格带、上下架状态都是分析常用字段需要重点保障。时间维度表dim_date是数仓里最容易被人忽略、但实际分析中最常用到的维表。建议一次性生成50年到100年的日期数据包含年、月、日、星期、季度、是否节假日、是否工作日等字段。后续所有的报表开发、指标计算都基于这张表做时间维度的汇总和钻取省时省力。店铺维度表dim_shop设计思路与用户维度表类似核心字段包括店铺ID、店铺名称、店铺等级、开店时间、主营类目、店铺状态。3.3 核心事实表设计订单事实表与订单明细事实表事实表设计是整个笔试设计题的重头戏也是最能拉开分数差距的地方。订单分析场景下事实表建议拆成两张一张是订单级事实表一张是订单明细订单项事实表。订单级事实表fact_order的粒度是一个订单一行数据对应一笔订单。核心字段包括订单ID主键用户ID外键关联dim_user店铺ID外键关联dim_shop下单日期外键关联dim_date订单状态维度退化属性订单原始金额优惠金额实付金额运费下单时间、支付时间用于计算支付时长订单明细事实表fact_order_item的粒度是一个订单中的一个商品项一行数据对应“一个订单里的某一个商品”。核心字段包括订单明细ID主键订单ID外键关联fact_order商品ID外键关联dim_product用户ID外键关联dim_user店铺ID外键关联dim_shop下单日期外键关联dim_date商品数量商品单价优惠分摊金额实付金额这里有个很重要的设计经验为什么订单实付金额不能直接等于商品单价乘以数量因为电商订单通常有满减、优惠券、会员折扣、运费调整等优惠金额分摊到一个商品项上需要一定的分摊逻辑。笔试题如果涉及这一块你最好能提出一个简单的分摊方案按商品金额占比分摊优惠金额最后一项做差额调整确保明细行实付金额之和等于订单实付金额。3.4 事实表的三种类型如何选择维度建模理论中事实表有三种常见类型事务事实表、周期快照事实表、累计快照事实表。笔试设计题中明确说出你选的是哪种事实表、以及为什么选它是加分项。事务事实表Transaction Fact Table记录每个业务事件的一行数据一旦发生就不再修改。订单事实表就是典型的事务事实表每下一单就记录一行订单状态变化通过更新状态字段来表示但金额等度量值不会回改。这种表适合做增量统计类分析比如每日订单量、GMV、用户下单次数。周期快照事实表Periodic Snapshot Fact Table按固定周期如每天记录某个业务的快照状态适合做存量类分析比如每日库存量、每日账户余额。在订单分析场景中如果你想分析“每天的待发货订单量与金额”周期快照事实表就是更合适的选择。累计快照事实表Accumulating Snapshot Fact Table用于跟踪一个业务过程从开始到结束的各个关键节点一行数据对应一个业务实例如一个订单但会不断更新记录各关键节点的时间戳。最典型的应用是订单生命周期分析下单时间、支付时间、发货时间、签收时间、完成时间全部放在一行里通过不断更新这行数据来反映订单流转状态。蘑菇街这套笔试题如果只让你设计一张订单事实表我建议默认选事务事实表然后补充说明“如果需要做订单生命周期分析可以再设计一张累计快照事实表”。这样既答了题又展示了你对事实表类型的完整理解。4. 笔试高频SQL题型与解题思路4.1 窗口函数笔试必考的送分题蘑菇街这套笔试题里的SQL题窗口函数几乎是必考的。窗口函数在数据仓库开发中的使用频率极高排名、累计、同环比、分组TopN这些分析需求离开窗口函数基本没法优雅实现。以一个经典题目为例查询每个用户最近一笔订单的金额。这个需求用普通GROUP BY很难写因为你要的是“每个用户的最新订单”不是“每个用户的订单总金额”。窗口函数可以这样写SELECT user_id, order_id, order_amount, order_time FROM ( SELECT user_id, order_id, order_amount, order_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY order_time DESC) AS rn FROM fact_order ) t WHERE rn 1;这个SQL里有两个知识点一是ROW_NUMBER()的用法二是子查询包一层再过滤rank值的写法。很多新手会直接写WHERE rn 1和窗口函数放同一个查询层级结果报错这是因为WHERE子句的执行顺序在窗口函数之前。这个坑在笔试里太常见了写出来就能避开一大批对手。ROW_NUMBER()、RANK()、DENSE_RANK()三个函数经常一起考区别要记清楚ROW_NUMBER()按顺序编号不关心并列值不重复RANK()有并列时占用后续编号比如1,1,3DENSE_RANK()有并列时不占用后续编号比如1,1,24.2 典型笔试SQL题每日新用户数与累计用户数还有一个高频SQL题是计算每日新用户数和累计用户数。这个题目在用户分析类笔试中出场率极高因为它综合考察了数据去重、日期处理和窗口函数的使用。假设有用户注册表user_register字段为user_id、register_date需要统计每日新用户数以及截至当日的累计用户数。参考答案SELECT register_date, COUNT(DISTINCT user_id) AS new_user_cnt, SUM(COUNT(DISTINCT user_id)) OVER (ORDER BY register_date) AS cum_user_cnt FROM user_register GROUP BY register_date ORDER BY register_date;这个写法的关键点在于SUM窗口函数里套了一个COUNT(DISTINCT ...)实现累计效果。还有一些更复杂的版本比如“统计每日活跃用户中新用户占比”需要在活跃表里关联注册表判断用户是否当天第一次出现考察的就不仅仅是窗口函数了还有关联逻辑。做这类题的时候有一个习惯我觉得很重要先别急着写SQL先在草稿纸上把输入数据长什么样、输出结果应该是什么样、中间需要几步转换写清楚然后再动手写。笔试的时候时间紧张很多人上来就写SQL写到一半发现逻辑不对再推翻重来浪费的时间远多于打草稿的时间。4.3 漏斗分析SQL下单转化率计算电商场景里频繁考察的还有漏斗分析蘑菇街这类电商公司出题的概率很高。一个典型的漏斗是浏览商品页→加入购物车→提交订单→完成支付。笔试经常让你计算其中某一步到下一步的转化率。假设有四张表browse_log浏览日志、cart_log加购日志、order_info订单表、payment_info支付表每张表都有user_id和时间字段。要计算“浏览-支付”的整体转化率就需要对四张表做关联去重统计SELECT COUNT(DISTINCT b.user_id) AS browse_users, COUNT(DISTINCT o.user_id) AS order_users, COUNT(DISTINCT p.user_id) AS pay_users, ROUND(COUNT(DISTINCT p.user_id) / COUNT(DISTINCT b.user_id), 4) AS browse_to_pay_rate FROM browse_log b LEFT JOIN order_info o ON b.user_id o.user_id LEFT JOIN payment_info p ON b.user_id p.user_id;这种题看着简单实际上考察的点很多一是JOIN造成的用户重复问题必须用COUNT(DISTINCT user_id)而不是COUNT(user_id)二是LEFT JOIN的关联条件如果只是计算整体转化率不需要关联时间条件如果要计算每天转化率就必须把日期字段也加到关联条件里否则会串数据。我当年做这类题的时候踩过最大的坑就是JOIN膨胀。两张表JOIN的时候如果关联字段不是唯一的结果行数会翻倍直接导致统计值失真。笔试里如果时间充足可以用子查询把每个步骤的用户数先单独算出来再嵌套计算转化率这样逻辑最清楚也最容易检查。4.4 留存率计算的两种思路留存率是用户运营分析的核心指标也是笔试SQL题的一大热门考点。最常见的需求是计算每日新增用户在次日、3日、7日后的留存率。假设有用户注册表user_registeruser_id, register_date和用户活跃表user_activeuser_id, active_date。计算每日新增用户次日留存率的经典写法SELECT r.register_date, COUNT(DISTINCT r.user_id) AS new_users, COUNT(DISTINCT a.user_id) AS retained_users, ROUND(COUNT(DISTINCT a.user_id) / COUNT(DISTINCT r.user_id), 4) AS retention_rate FROM user_register r LEFT JOIN user_active a ON r.user_id a.user_id AND a.active_date DATE_ADD(r.register_date, 1) GROUP BY r.register_date ORDER BY r.register_date;关联条件里为什么同时写了用户ID相等和日期相差1天这是为了让JOIN结果只保留符合“次日活跃”条件的记录配合LEFT JOIN实现未活跃补0的效果。这个思路在笔试中很常用可以举一反三把DATE_ADD的数值改成3就是3日留存改成7就是7日留存。如果需要的不是某个固定日期的留存而是连续多日的留存矩阵比如新增用户在第1天到第7天的每日留存率可以这样写SELECT r.register_date, COUNT(DISTINCT r.user_id) AS new_users, COUNT(DISTINCT CASE WHEN DATEDIFF(a.active_date, r.register_date) 1 THEN a.user_id END) AS day1_retained, COUNT(DISTINCT CASE WHEN DATEDIFF(a.active_date, r.register_date) 3 THEN a.user_id END) AS day3_retained, COUNT(DISTINCT CASE WHEN DATEDIFF(a.active_date, r.register_date) 7 THEN a.user_id END) AS day7_retained FROM user_register r LEFT JOIN user_active a ON r.user_id a.user_id AND a.active_date BETWEEN DATE_ADD(r.register_date, 1) AND DATE_ADD(r.register_date, 7) GROUP BY r.register_date;这种CASE WHEN 条件聚合的写法比多次LEFT JOIN要简洁高效得多笔试写出来是明显的加分项。但要注意关联条件里BETWEEN的取值范围决定了CASE WHEN里只能统计1到7天的留存如果你还想算第14天的这个写法就不行了需要调整关联范围或拆成多次查询。5. 数据仓库设计题的高分答题模板5.1 设计题的标准化答题步骤蘑菇街这套笔试的设计题分值占比很高答题的时候有一个标准化的流程按步骤来写逻辑清晰不容易漏点。我把这个流程整理成五步第一步明确业务过程和分析需求。写清楚“我要分析的业务过程是用户下单核心分析需求包括GMV趋势、用户贡献、商品表现、渠道对比”。第二步定义事实表的粒度。写清楚“订单事实表粒度为一个订单订单明细事实表粒度为一个订单中的一个商品项”。第三步列出维度及对应维度表。写清楚需要哪些维度时间、用户、商品、店铺、渠道分别建立维度表并说明核心字段。第四步设计事实表的度量字段。写清楚事实表中的可加度量金额、数量、半可加度量如金额占比等比例类指标和不可加度量。第五步补充ETL与数据更新策略。写清楚数据如何从业务库同步到数仓、事实表按天分区、维度表采用何种SCD策略、任务调度依赖关系怎么配置。这五步看起来是笔试答题模板但实际工作中做数仓模型设计也完全适用。我刚入行时做模型设计总是想到哪设计到哪后面被架构师review过几次发现好方案都是结构化的每一步都有明确的输入和输出。5.2 完整设计示例订单分析核心表结构下面给出一个完整的、可以直接用在笔试答题中的表结构设计示例用的就是前面说的五步法。这套结构我在多个项目中实际落地过字段做了一些脱敏和简化处理但核心设计思路是完整保留的。用户维度表dim_userCREATE TABLE dim_user ( user_id BIGINT COMMENT 用户ID, user_name STRING COMMENT 用户昵称, gender TINYINT COMMENT 性别 1男 2女 0未知, age_group STRING COMMENT 年龄段, register_date STRING COMMENT 注册日期, register_channel STRING COMMENT 注册渠道, membership_level STRING COMMENT 会员等级, is_active TINYINT COMMENT 是否活跃 1是 0否, etl_time TIMESTAMP COMMENT ETL更新时间, PRIMARY KEY (user_id) DISABLE NOVALIDATE ) COMMENT 用户维度表;商品维度表dim_productCREATE TABLE dim_product ( product_id BIGINT COMMENT 商品ID, product_name STRING COMMENT 商品名称, category_id BIGINT COMMENT 二级类目ID, category_name STRING COMMENT 二级类目名称, level1_category_id BIGINT COMMENT 一级类目ID, level1_category_name STRING COMMENT 一级类目名称, brand_id BIGINT COMMENT 品牌ID, brand_name STRING COMMENT 品牌名称, price DECIMAL(10,2) COMMENT 当前售价, status TINYINT COMMENT 商品状态 1上架 0下架, etl_time TIMESTAMP COMMENT ETL更新时间, PRIMARY KEY (product_id) DISABLE NOVALIDATE ) COMMENT 商品维度表;订单事实表fact_orderCREATE TABLE fact_order ( order_id BIGINT COMMENT 订单ID, user_id BIGINT COMMENT 用户ID, shop_id BIGINT COMMENT 店铺ID, order_date STRING COMMENT 下单日期 yyyy-MM-dd, order_status TINYINT COMMENT 订单状态 1待支付 2已支付 3已发货 4已签收 5已取消, order_source STRING COMMENT 订单来源渠道, original_amount DECIMAL(10,2) COMMENT 订单原金额, discount_amount DECIMAL(10,2) COMMENT 优惠金额, shipping_fee DECIMAL(10,2) COMMENT 运费, pay_amount DECIMAL(10,2) COMMENT 实付金额, order_time STRING COMMENT 下单时间 yyyy-MM-dd HH:mm:ss, pay_time STRING COMMENT 支付时间, country STRING COMMENT 收货国家, province STRING COMMENT 收货省份, city STRING COMMENT 收货城市, etl_time TIMESTAMP COMMENT ETL更新时间 ) COMMENT 订单事实表 PARTITIONED BY (dt STRING COMMENT 分区字段按下单日期分区);商品订单明细事实表fact_order_item在fact_order基础上去掉店铺维度、金额换成商品维度的数据加上商品ID、商品数量、商品单价、优惠分摊金额、实付金额等字段分区字段同样是下单日期。这套设计直接写进笔试答案里内容量已经足够丰富而且每个字段都能说出设计理由评分老师很难挑出大问题。5.3 笔试答题中的常见丢分点归纳整理了一些实际改卷过程中常见的丢分点供大家对照检查只写了表结构没有说明粒度定义扣分。事实表粒度是整个设计的灵魂不写等于没设计。维度表和事实表混在一起没有区分概念扣分。有些人设计的表里既有订单信息又有用户信息还有商品信息典型的大宽表思维但这种表不算是规范的维度建模。时间维度没有作为维度表处理扣分。很多候选人把下单日期直接当作字符串字段放在事实表里没有考虑时间维度表对后续按周、按月汇总分析的支持。没有给出分区策略和更新策略扣分。数仓设计不仅是表结构设计还要考虑数据怎么刷进来、怎么更新。事实表设计没有说明是哪种类型事务/快照/累计扣分。明确说出类型并解释原因才能体现理论功底。注意笔试答题时宁可多写也不要少写但是多写的内容得是跟设计相关的分析和说明不是堆砌无关的字段和概念。每写一个字段都要能解释清楚这个字段在后续分析中会被怎么使用这才是有价值的设计。6. 数据仓库岗位面试中的高频追问与应对思路6.1 从笔试到面试设计题的延伸追问蘑菇街这类公司如果笔试通过进入面试后大概率会围绕笔试题目做延伸追问。比如你笔试里写了用户维度表用SCD2管理会员等级变化面试官就会追问会员等级变更是通过什么机制捕获的是业务库每天推送全量快照还是通过binlog订阅增量变更如果两种方式都没有你怎么用离线数仓的方式实现SCD2的数据加工这种追问是典型的工程落地考察。我的建议是提前准备好一套基于SQL的SCD2实现方案核心思路是分别处理新增和变更两种情况。新增直接插入新版本记录。变更先关掉旧版本的生效标记再插入新版本记录。用Hive SQL实现的时候通常采用“左关联条件判断”的方式用业务主键关联新旧数据匹配不上的全是新增匹配上的再做字段比对有变更的走SCD2流程。另一个常见追问是事实表的分区策略为什么选按天分区而不是按小时或按月这个问题没有标准答案但你要能说清楚决策依据。按天分区是互联网数仓最常见的实践因为数据量适中、存储成本可控、任务调度按天跑不会太慢。遇到超大业务量可以按小时分区但查询和分析复杂度会上升遇到月度报表为主的需求按天分区也基本能兼容因为汇总查询可以基于分区裁剪直接扫一个月的数据。6.2 笔试中不会明说但实际很看重的数据质量意识数据质量是数据仓库开发中的核心话题但它很少作为独立的笔试题目出现而是渗透在设计题和SQL题里。比如订单事实表里的金额字段如果你设计了original_amount、discount_amount、shipping_fee、pay_amount四个字段面试官大概率会追问这四个字段之间有什么约束关系如果不一致怎么办正确的约束关系应该是pay_amount original_amount - discount_amount shipping_fee。这个等式应该在ETL加工的最末端做一个校验凡是违反这个等式的数据行要么告警、要么阻断入库、要么进异常数据表做补偿处理。你如果在笔试答卷里能主动加上这句话说明你具备数据质量意识这是多数候选人完全没想到的加分项。还有一类数据质量问题跟维度表相关维度表和事实表之间的引用完整性。事实表里出现了用户维表里不存在的user_id怎么处理行业标准做法是做一个“未知成员”维度行user_id填-1或0user_name填“未知用户”这样在关联查询时数据就不会因为匹配不上而丢失。这个细节很小但很能体现工程经验。6.3 校招数仓岗的简历与笔试联动准备最后聊一个跟笔试无关但跟拿到offer有关的话题简历准备。很多人的简历上写了数据仓库项目经历但写得很泛跟笔试考察点完全不搭。如果你正在准备数据仓库岗位的实习或校招简历上的项目描述要围绕笔试的考点来写这样笔试和面试才有联动性。举一个正反面对比的例子。反面写法“负责用户订单分析数据仓库的搭建包括ETL开发、报表开发、日常运维。”这种写法的问题在于只有动作没有细节面试官看完记不住任何信息。正面写法“主导设计用户订单分析数仓模型包括用户、商品、时间等5张维度表和订单、订单明细2张事实表基于Hive搭建每日ETL调度任务完成从业务库到数仓的增量数据同步并通过事实表金额等式校验保障数据质量基于数仓模型开发GMV日报、用户留存分析、品类销售排行等核心报表。”两种写法的信息量差距一目了然。笔试和简历是互为犄角的关系。笔试里你展示出来的思考深度在简历里也要能找到对应的实践支撑。面试官最怕遇到的情况是笔试答案写得很好但简历里的项目经历跟笔试答案对不上。这种情况基本一票否决。7. 数据仓库笔试的备考与实操建议7.1 三个月备考路径照着做就行如果你现在才开始准备数据仓库岗的校招笔试不用慌按下面这条路径走三个月时间完全够用。第一个月打基础把《数据仓库工具箱》前六章读透重点理解维度建模四步法、事实表和维度表的类型与设计、SCD策略、星型和雪花模型。同时把SQL窗口函数练熟每天在本地或在线平台上刷5-10道窗口函数练习题。第二个月刷题加设计练习把牛客、LeetCode数据库板块上面试高频SQL题刷一遍重点覆盖留存计算、漏斗分析、TopN、累计、同环比这几类场景。另外找3-5个数仓设计案例题来练手比如电商订单分析、内容平台用户行为分析、物流配送时效分析每个案例都按前面说的五步法写完整的设计文档。第三个月模拟面试查漏补缺找人模拟面试或者自己对着镜子把设计题讲一遍看能不能在不看笔记的情况下把表结构、粒度定义、SCD策略、事实表类型讲清楚。这一个月重点不是学新东西而是把已经掌握的内容输出得足够流畅。7.2 实操中才能沉淀的几条数仓开发经验备考过程中如果你有条件强烈建议自己动手搭一个简单的数仓Demo。不用复杂的环境一台8G内存的电脑装个MySQL或者直接用在线SQL平台就行核心是把下面这几件事真正做一遍第一从一张订单明细Excel表出发设计维度表和事实表然后写SQL把Excel数据清洗后导入事实表和维度表。这个过程会让你真正理解ETL里“清洗”的环节到底在做什么格式统一、空值处理、非法值剔除。第二给用户维表加一个会员等级字段模拟会员升级的场景然后跑一遍SCD2的SQL加工逻辑观察事实表关联用户维表的结果变化。内存里跑通一次SCD2比读十遍理论都管用。第三故意在事实表里造几条违反金额等式的数据然后写校验SQL把他们找出来。这个过程会让你对数据质量校验有更深的体感面试聊到数据质量的时候能讲出真实的踩坑经历。7.3 笔试复习中最容易忽视的两个细节最后分享两个笔试备考中经常被忽视的细节。第一个是SQL的方言差异。Hive SQL和MySQL虽然大体语法相同但在日期函数、字符串函数上有不少差异。比如MySQL里日期加减是DATE_ADD和DATE_SUBHive里是DATE_ADD和DATE_SUB也支持但Hive里更常用的是date_add(register_date, 1)这种写法不用引号包数值。笔试如果明确写了基于Hive环境最好用Hive的方言习惯回答问题。第二个细节是答题时的时间分配。笔试的时间很紧张尤其是设计题一写就是一大段。建议拿到试卷先大致扫一遍题目把每道题的分值和时间预估写下来优先做分值高的设计题和必得分的窗口函数SQL题压轴难题如果时间不够可以写核心思路然后放弃。我在实际工作里带过不少实习生一个比较明显的规律是能把笔试设计题答到“粒度定义清晰、维度表完整、事实表规范、更新策略明确”这个程度的候选人入职后上手数据模型设计的速度通常也很快。因为笔试考察的本质上不是知识点背诵而是你有没有形成数据建模的思维方式。这套思维方式一旦建立了无论以后换什么业务场景、换什么技术栈内核都不会变。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号