Module 01 · Extract, Transform, Load (ETL)提取、转换与加载(ETL)
Extract, Transform, Load (ETL)提取、转换与加载(ETL)
学习目标
观看本视频后,您将能够:
- 定义提取、转换、加载(ETL)流程。
- 解释 ETL 功能的正确执行顺序。
- 编写一个简单的 ETL 程序。
什么是 ETL?
您是否曾想过数据是如何从多个来源收集并组合成单一信息源的?
这种类型的数据收集称为批量处理 (Batch Processing),而我们今天要探讨的是一种特殊的批量处理类型——提取、转换和加载 (Extract, Transform and Load, 或 ETL)。
ETL 顾名思义:它是从多个来源和格式中提取大量数据,转换成一种特定格式,然后将其加载到数据库或目标文件的过程。
ETL 流程示例
假设您是一家初创公司的所有者,该公司构建了一个 AI,使用身高和体重来预测某人患糖尿病的风险。
- 数据来源: 部分数据为 CSV 格式,另一部分为 JSON 文件。
- 需求: AI 只能读取一个大的 CSV 文件,且使用公制单位。
| 步骤 | 动作 | 目标/要求 |
|---|---|---|
| 提取 (Extract) | 收集所有 CSV 和 JSON 数据。 | 将所有数据汇集到一个文件中,供 AI 读取。 |
| 转换 (Transform) | 将英制单位转换为公制单位。 | 将数据从英制单位(如英寸、磅)转换为公制单位(如米、千克)。 |
| 加载 (Load) | 将转换后的数据保存为 CSV 文件。 | 将数据加载为 AI 可读取的单一 CSV 文件。 |
使用 Python 实现 ETL
接下来,我们将使用 Python 来实现上述 ETL 流程。
1. 提取 (Extract)
提取步骤会批量地从多个来源提取大量数据。
提取前的准备glob函数
在讨论提取函数之前,先了解其构成函数:来自 glob 模块的 glob 函数。
- 输入: 文件扩展名(例如,
"*.csv")。 - 输出: 具有该特定扩展名的文件列表。
例如,对于 .json 和 .csv 文件的列表:
- 输入
glob("*.csv"),输出是.csv文件列表。 - 输入
glob("*.json"),输出是.json文件列表。
数据提取函数实现
我们可以编写函数来分别提取 CSV 和 JSON 文件中的姓名、身高和体重:
- CSV 提取: 输入是
.csv文件名,结果是DataFrame。 - JSON 提取: 输入是
.json文件名,输出是DataFrame。
extract函数主体逻辑
- 创建空
DataFrame: 首先创建一个名为extracted_data的空DataFrame并分配列名。 - 提取 CSV 文件:
- 添加一个循环和
glob函数来查找所有 CSV 文件。 - 在每次循环迭代中,
CSV文件被附加到DataFrame中,从而形成一个已提取数据的列表。
- 添加一个循环和
- 提取 JSON 文件: 类似的代码段将 JSON 文件附加到
DataFrame中。
ignore_index参数解释
我们将深入探讨参数 ignore_index="True" 的作用:
| 参数设置 | 结果 | 目的 |
|---|---|---|
ignore_index 不设置为 True |
extracted_data 的索引将与原始文件的行号相同,可能导致索引重复。 |
默认行为。 |
ignore_index 设置为 True |
每行的顺序将与该行被附加到 DataFrame 的顺序相同,从而创建新的、连续的索引。 |
确保所有附加行具有唯一的索引。 |
2. 转换 (Transform)
数据收集完成后,下一步是转换。
这个函数负责将 DataFrame 中的数据进行单位转换:
- 将身高 (height) 列(单位:英尺/英寸)转换为米。
- 将体重 (weight) 列(单位:磅)转换为千克。
- 返回转换后的数据。
具体操作:
- 输入
DataFrame中,身高列(单位:英尺/英寸)应用特定操作,将其转换为米,并四舍五入到小数点后两位。 - 转换后的
DataFrame中,身高列现在以米为单位。 - 对体重列执行类似的操作,将其转换为千克。
3. 加载与日志记录 (Load and Logging)
加载 (Load)
数据收集和定义(转换)完成后,是时候将其加载到目标文件了。
- 在此案例中,我们直接将 Pandas
DataFrame保存为 CSV 文件。
日志记录 (Logging)
在完成任务之前,我们需要创建一个日志条目。
日志记录函数的创建步骤:
- 创建一个变量
timestamp_format,用于确定时间和日期的格式。 - 创建
now变量,通过调用datetime来捕获当前时间。- 注意:需要导入
datetime模块才能使其正常工作。
- 注意:需要导入
- 通过打开一个文件并使用
"a"(追加模式)写入信息,将这些信息整合在一起。- 使用
"a"模式意味着所有写入的数据都将附加到现有信息之后。
- 使用
通过创建这种类型的条目,我们能够为流程的每个部分的开始和完成附加一个时间戳。
调用 ETL 流程
我们已经定义了运行 ETL 流程所需的所有代码。最后一步是调用所有函数:
- 首先调用
extract_data函数。 - 此步骤接收到的数据被传输到第二步——数据转换。
- 完成转换后,数据被加载到目标文件。
‼️ 注意: 在每个步骤之前和之后都添加了开始和完成的时间和日期(通过日志记录函数)。
总结回顾
在本视频中,您学习了如何编写:
- 一个简单的提取 (Extract) 函数。
- 一个简单的转换 (Transform) 函数。
- 一个简单的加载 (Load) 函数。
- 一个简单的日志记录 (Logging) 函数。
请查看实验部分获取更多示例。