数据工程学习没门路?data-engineer-handbook 实战完整指南:从一键起实验室到 SCD 维度建模
【免费下载链接】data-engineer-handbookThis is a repo with links to everything you'd ever want to learn about data engineering项目地址: https://gitcode.com/GitHub_Trending/da/data-engineer-handbook
周日晚上十点,你刚投完数据工程的岗位,决定认真补补硬技能。打开浏览器搜 "awesome data engineering",教程列了三大屏,收藏了一周,一个都没动手。data-engineer-handbook 就是为这种局面准备的:它把数据工程学习资源整理成库,给出 4 周初级和 6 周中级两个训练营,中级营直接附带能在你电脑上跑起来的实验环境。读完本文,你能在半小时内搭好本地实验室,亲手跑通 SCD(Slowly Changing Dimensions,属性变化时保留历史行的一种表设计方法)维度建模练习。
30 秒速览
- 环境一条命令起:clone 仓库,
make up,Postgres 加 PGAdmin 容器直接跑起来。 - 数据是现成的:镜像自带数据转储文件,初始化脚本自动还原一套游戏球员数据集,不用自己编造数据。
- 核心教材是 SCD 与幂等性:维度建模加慢变化维度,是数据工程面试里出现频率最高的两个话题。
- 不用读一行源码:所有实验都是 SQL,打开 PGAdmin 就能写,写完直接对照作业校验。
它到底怎么工作的
敲下 make up 时发生了什么
中级营第 1、2 周的实验架在一个两服务的 docker-compose.yml 上:一个 postgres 14,一个 pgadmin4。关键在 postgres 容器把 scripts/init-db.sh 挂进了入口点目录。容器第一次初始化时,脚本先用pg_restore把data.dump还原进去,再顺带执行 homework 目录里的所有 SQL。也就是说"起容器"和"灌数据"是同时发生的,容器变绿的那一刻表就已经在了。这也是后面"表不见了"那个坑的伏笔:它只在初始化时跑一次。
为什么 SCD 表重跑之后还对得上
先说清楚幂等性:一个管道跑一遍和跑两遍,结果完全一样。增量 SCD 脚本把新赛季的球员分成四类,最后合并成一张完整表:
SELECT *, 2022 AS current_season FROM ( SELECT * FROM historical_scd UNION ALL SELECT * FROM unchanged_records UNION ALL SELECT * FROM unnested_changed_records UNION ALL SELECT * FROM new_records ) a白话讲,这是一次"对账"。四个 CTE(WITH 定义的临时结果集,在一条 SQL 内可反复引用)分别对应:老历史行原样保留、本季没变的行延长结束日期、变了的人先给旧记录关账再开一条新记录、新来的球员从零建档。四类不重不漏地覆盖所有人,所以你跑一遍还是跑两遍,最终的表都一样。这就是幂等性,也是 增量生成脚本 的骨架。

SCD 类型怎么影响幂等性
维度属性按变化方式分成 SCD 0 到 3 型。0 型是永不变化的值(比如生日),谈不上 SCD;1 型只保留最新值;2 型给每行留一个生效区间,start_season到end_season,当前行标记为活跃;3 型只存"原值"和"当前值"两个槽位。这张视觉笔记里给了结论:2 型是幂等的,回看任意一天数据都一致;1 型和 3 型在回刷时会丢失"当时是什么样"的信息,结果依赖于你什么时候跑。所以实验统一用 2 型建模,这张表的 建表语句 就 9 行,值得逐字段读一遍。
手把手配出来
🐳 第一步:三行起实验室
git clone https://gitcode.com/GitHub_Trending/da/data-engineer-handbook.git cd>cp example.env .env make up第二步:确认数据真的灌进去了
docker exec -it my-postgres-container psql -U postgres -d postgres -c '\dt'为什么这么设:\dt直接列表名,看到players、team这类表就说明还原成功,不必绕道图形界面。图形界面在localhost:5050,登录凭证就是.env里的PGADMIN_EMAIL和PGADMIN_PASSWORD。新建服务器时 Host 填host.docker.internal(从宿主机容器视角访问本机),端口 5432,库名用户都是postgres:
第三步:哪些参数该改哪些别动
| 参数 | 默认值 | 建议值 | 一句话说明 |
|---|---|---|---|
POSTGRES_PASSWORD | postgres | 自己的 | 实验凭证,养成改掉默认值的习惯 |
HOST_PORT | 5432 | 5432 | 宿主机端口,机器上有别的库就换 5433 |
PGADMIN_PORT | 5050 | 5050 | PGAdmin 网页端口,冲突时同理 |
DOCKER_CONTAINER | my-postgres-container | 别动 | Makefile 靠这个名字定位容器 |
PGADMIN_EMAIL/PGADMIN_PASSWORD | postgres@postgres.com / postgres | 改完立即重建 | 仅容器首次构建时生效 |
改完.env如果行为没变,十有八九是容器没重建,回第一步down -v再up -d。
🧯 这几个坑我替你先踩了
表不见了。现象:容器是绿的,PGAdmin 里表列表却是空的。根因:init-db.sh只在数据卷首次初始化时执行,第一次还原失败后留下的"已初始化但空"的卷,会让后续重启永远跳过还原。处理:docker compose down -v删掉数据卷再docker compose up -d,强制走一遍初始化。
PGAdmin 登录不进去。现象:网页能打开,但你按.env改过的账号密码被拒。根因:PGAdmin 的默认凭证在容器首次构建时就写死了,之后再改.env不生效。处理:要么改回原值,要么down -v重建容器让它重新读配置。
端口被占。现象:启动时报 "port is already allocated"。根因:你机器上另一个 Postgres 或遗留容器占着 5432。处理:.env里HOST_PORT改成 5433,PGAdmin 连接里的端口同步改。
再往前走一步
- SQL 实验做熟后,回到 1-dimensional-data-modeling 实验目录,重点看 scd_generation_query.sql:用
LAG找变化点、再按"连续相同值"归组,是经典的游程压缩问题,面试官爱问。 - 同一套数据在 3-spark-fundamentals 里用 PySpark 重做一遍,还配了 单元测试,能补上"管道怎么验证"这一课。
回实验室把增量 SCD 的 SQL 连跑两遍,拿两次的结果逐行 diff 确认幂等性,比读十篇文章都管用。
【免费下载链接】data-engineer-handbookThis is a repo with links to everything you'd ever want to learn about data engineering项目地址: https://gitcode.com/GitHub_Trending/da/data-engineer-handbook
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考