🏛️ 架构
🏗️ 技术架构
- 编排工具: GitHub Actions
- 数据仓库: Snowflake
- 数据转换: dbt
- 编程语言: Python
📁 项目结构
nyc-taxi-pipeline/
├── .github/
│ ├── workflows/
│ │ ├── nyc_taxi_pipeline.yml
│ │ ├── codeql.yml
│ │ ├── python_code_tests.yml
│ │ ├── release.yml
│ │ └── sqlfluff.yml
│ │
│ └── dependabot.yml
│
├── docs/
│
├── snowflake_ingestion/
│ ├── init_data_warehouse.py
│ ├── scrape_links.py
│ ├── upload_stage.py
│ ├── load_to_table.py
│ │
│ ├── sql/
│ │ ├── init/
│ │ ├── scraping/
│ │ ├── stage/
│ │ └── load/
│ │
│ └── tests/
│
└── dbt_transformations/
└── NYC_Taxi_dbt/
└── models/
├── staging/
├── final/
└── marts/
📊 数据处理流程
主要流程
纽约出租车数据管道
每月执行的数据摄取管道:
- Snowflake 基础设施初始化 初始化 Snowflake 基础设施(数据库、模式、仓库、角色、用户)。
- 抓取链接 抓取并获取源链接。
- 上传到 Stage 将原始文件上传到 Snowflake Stage。
- 加载到表 将数据加载到 RAW 模式的表中。
- 运行 dbt 转换 执行 dbt 转换(STAGING 然后是 FINAL)。
- 运行 dbt 测试 执行 dbt 测试以验证模型。
- 备份策略
自动配置数据库、RAW表和FINAL模式的备份策略。
质量流程
- CodeQL 安全扫描
使用 CodeQL 对 Python 代码进行静态分析,以检测每次推送或拉取请求到
dev和main时的漏洞。 - Dependabot 更新 每季度自动更新 Python 和 GitHub Actions 依赖项。
- 页面构建与部署 通过 GitHub Pages 自动部署项目文档。
- Python 代码测试
在每次推送或拉取请求到
dev和main时执行 Pytest 单元测试。 - 版本发布
通过 Python Semantic Release 自动进行版本控制、生成变更日志和发布版本,每次推送或拉取请求到
main时触发。 - SQL 代码质量
使用 SQLFluff 对 SQL 代码(dbt 模型和 Snowflake 脚本)进行自动 linting,每次推送或拉取请求到
dev和main时执行。
数据建模 (Data Modeling)
此表记录了数据的存储方式。
| 表名称 | 模式 | 表类型 | 物化方式 |
|---|---|---|---|
| FILE_LOADING_METADATA | SCHEMA_RAW |
瞬态表 | 表 |
| YELLOW_TAXI_TRIPS_RAW | SCHEMA_RAW |
永久表 | 增量 |
| TAXI_ZONE_LOOKUP | SCHEMA_RAW |
永久表 | 表 |
| TAXI_ZONE_STG | SCHEMA_STAGING |
瞬态表 | 表 |
| YELLOW_TAXI_TRIPS_STG | SCHEMA_STAGING |
瞬态表 | 增量 |
| int_trip_metrics | SCHEMA_STAGING |
视图 | |
| fact_trips | SCHEMA_FINAL |
永久表 | 增量 |
| dim_locations | SCHEMA_FINAL |
永久表 | 表 |
| dim_time | SCHEMA_FINAL |
永久表 | 表 |
| dim_date | SCHEMA_FINAL |
永久表 | 表 |
| marts | SCHEMA_FINAL |
视图 |
详细内容可查阅 📚 在线 dbt 文档
星型模式(ERD)
%%{init: {"themeVariables": {"fontSize": "10px"}}}%%
erDiagram
FACT_TRIPS {
number surrogate_key PK
number date_id FK
number time_id FK
number location_id FK
float fare_amount
float trip_distance
}
DIM_DATE {
number date_id PK
int year
int month
int day_of_week
}
DIM_TIME {
number time_id PK
int hour
string period_of_day
}
DIM_LOCATIONS {
number location_id PK
string zone
string borough
}
FACT_TRIPS }o--|| DIM_DATE : "pickup / dropoff"
FACT_TRIPS }o--|| DIM_TIME : "pickup / dropoff"
FACT_TRIPS }o--|| DIM_LOCATIONS : "pickup / dropoff"
📐 缓慢变化维度
3 个维度均为 SCD Type 0:不预期任何变化。
| 维度 | SCD 类型 | 理由 |
|---|---|---|
dim_date |
Type 0 | 日期属性永不改变 |
dim_time |
Type 0 | 时间属性永不改变 |
dim_locations |
Type 0 | NYC TLC 区域参考数据稳定 |
可能的演进:
- 区域名称更正 → SCD Type 1(覆盖,无历史记录)
- 区域拆分 → SCD Type 2(新增行,含
valid_from、valid_to、is_current)