Mage-AI项目实战:构建餐厅交易数据ETL管道教程
前言
在现代数据工程实践中,ETL(提取、转换、加载)管道是数据基础设施的核心组件。本文将基于Mage-AI项目,手把手教你构建一个完整的ETL数据管道,处理餐厅用户交易数据并将其存储到DuckDB数据库中。
项目概述
本教程将实现以下数据处理流程:
- 数据提取:从在线API获取CSV格式的餐厅交易数据
- 数据转换:清洗列名并添加新特征列
- 数据加载:将处理后的数据写入DuckDB数据库
环境准备
在开始前,请确保已完成以下准备工作:
- 安装并配置好Python 3.7+环境
- 安装必要的Python包:pandas、requests、duckdb
- 确保Docker环境已正确安装(如需使用容器化部署)
详细步骤
第一步:创建ETL管道
- 在Mage-AI界面中导航至管道列表页面
- 点击"新建"按钮,选择"标准(批处理)"类型
- 将管道命名为"ETL演示"并保存设置
专业提示:在正式生产环境中,建议为每个数据源创建独立的管道,便于维护和监控。
第二步:从API加载数据
- 添加Python数据加载器模块,选择API模板
- 使用以下代码从公开API获取数据:
import io
import pandas as pd
import requests
@data_loader
def load_data_from_api(*args, **kwargs):
url = '餐厅交易数据CSV链接'
response = requests.get(url)
return pd.read_csv(io.StringIO(response.text), sep=',')
@test
def test_row_count(df, *args) -> None:
assert len(df.index) >= 1000, '数据行数不足'
关键点解析:
@data_loader
装饰器标识这是一个数据加载函数- 使用requests库处理HTTP请求,确保数据获取可靠性
@test
装饰器定义数据质量检查,确保数据完整性
第三步:数据转换处理
- 添加Python转换器模块
- 实现以下转换逻辑:
def number_of_rows_per_key(df, key, column_name):
return df.groupby(key)[key].agg(['count']).rename(columns={'count': column_name})
def clean_column(column_name):
return column_name.lower().replace(' ', '_')
@transformer
def transform(df, *args, **kwargs):
# 添加用户用餐次数统计列
df_new_column = number_of_rows_per_key(df, 'user ID', 'number of meals')
df = df.join(df_new_column, on='user ID')
# 标准化列名
df.columns = [clean_column(col) for col in df.columns]
return df.iloc[:100] # 限制数据量用于演示
@test
def test_number_of_columns(df, *args) -> None:
assert len(df.columns) >= 11, '列数不足'
数据处理技巧:
- 使用groupby进行分组聚合计算
- 列表推导式批量处理列名标准化
- 限制输出数据量便于演示(生产环境应移除该限制)
第四步:导出到DuckDB
- 创建SQL数据导出模块
- 配置DuckDB连接
- 使用以下SQL语句导出数据:
SELECT * FROM {{ df_1 }}
DuckDB优势说明:
- 轻量级嵌入式数据库,无需复杂配置
- 兼容SQL标准,学习成本低
- 性能优异,特别适合分析型工作负载
验证与测试
完成管道构建后,应进行以下验证:
- 检查数据加载阶段是否获取到足够样本
- 验证转换逻辑是否正确应用
- 确认DuckDB中表结构和数据符合预期
生产环境建议
在实际生产部署时,建议考虑:
- 添加异常处理和重试机制
- 实现增量数据加载策略
- 设置数据质量监控告警
- 考虑添加数据沿袭追踪功能
总结
通过本教程,我们使用Mage-AI构建了一个完整的ETL管道,实现了从数据获取到最终存储的全流程。这个示例展示了Mage-AI的核心能力:
- 直观的可视化管道设计
- 灵活的Python/SQL混合编程
- 内置的数据质量检查
- 多数据源支持
掌握这些基础后,你可以进一步探索Mage-AI的高级功能,如调度执行、依赖管理、分布式处理等,构建更复杂的数据处理系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考