模拟从常见来源(一个简单的逗号分隔值(CSV)文件)中提取数据的过程,可以演示提取阶段如何运作。这项练习有助于巩固对数据如何在ETL工作流程中初步获取的认识。场景:提取客户订单假设您在一家在线零售商工作。每天都会生成一个名为 orders.csv 的新文件,其中包含已下订单的详细信息。您的任务是提取这些数据,以便后续处理。表示源数据假设今天的 orders.csv 文件如下所示:OrderID,CustomerID,OrderDate,Amount,Status 101,CUST-A,2023-10-26,150.00,Shipped 102,CUST-B,2023-10-26,75.50,Processing 103,CUST-A,2023-10-27,210.25,Shipped 104,CUST-C,2023-10-28,30.00,Pending这是结构化数据。每行表示一个订单,值之间用逗号分隔。第一行是表头,定义了字段(列)。模拟连接在真实的ETL管道中,专用工具或脚本会建立与 orders.csv 所在文件系统(或数据库、或API端点)的连接。对于本次模拟,我们假设已成功连接并可以访问文件内容。模拟完全提取如前所述,完全提取涉及从源读取整个数据集。如果我们对 orders.csv 执行完全提取,拉入ETL流程的原始数据将类似于这样(此处表示为记录列表):[ {"OrderID": "101", "CustomerID": "CUST-A", "OrderDate": "2023-10-26", "Amount": "150.00", "Status": "Shipped"}, {"OrderID": "102", "CustomerID": "CUST-B", "OrderDate": "2023-10-26", "Amount": "75.50", "Status": "Processing"}, {"OrderID": "103", "CustomerID": "CUST-A", "OrderDate": "2023-10-27", "Amount": "210.25", "Status": "Shipped"}, {"OrderID": "104", "CustomerID": "CUST-C", "OrderDate": "2023-10-28", "Amount": "30.00", "Status": "Pending"} ]请注意,数据是完全按照文件中的样子提取的,包括以字符串形式表示的数据类型。结构(字段名称)是从表头行中获取的。这是下一阶段的原始材料。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [color="#495057", fontname="sans-serif"]; Source [label="orders.csv\n(源文件)", shape=note, fillcolor="#a5d8ff"]; ExtractionProcess [label="提取\n过程", fillcolor="#96f2d7"]; ExtractedData [label="原始提取\n数据", shape=cylinder, fillcolor="#ffec99"]; Source -> ExtractionProcess [label="读取所有数据"]; ExtractionProcess -> ExtractedData; }一个图表,展示了完全提取过程如何读取整个源文件(orders.csv)以生成原始提取数据。模拟增量提取现在,假设一段时间过去了,orders.csv 文件中添加了一个新订单:OrderID,CustomerID,OrderDate,Amount,Status 101,CUST-A,2023-10-26,150.00,Shipped 102,CUST-B,2023-10-26,75.50,Processing 103,CUST-A,2023-10-27,210.25,Shipped 104,CUST-C,2023-10-28,30.00,Pending 105,CUST-B,2023-10-28,99.99,Processing <-- 新订单如果我们采用增量提取策略,目的是只提取自上次提取以来新增或更改的数据。假设我们的ETL流程记录了上次提取的 OrderID(即104),它将查询或扫描源以查找ID大于104的订单。在本次模拟中,增量提取将仅产生新记录:[ {"OrderID": "105", "CustomerID": "CUST-B", "OrderDate": "2023-10-28", "Amount": "99.99", "Status": "Processing"} ]如果源数据集很大且变化相对较小,这比重新提取整个文件效率高得多。识别变化的逻辑(例如使用ID、时间戳或CDC方法)是增量策略的重要组成部分。处理提取问题(模拟)如果源文件有错误怎么办?例如:OrderID,CustomerID,OrderDate,Amount,Status 101,CUST-A,2023-10-26,150.00,Shipped 102,CUST-B,2023-10-26,,Processing <-- 缺少金额 103,CUST-A,2023-10-27,210.25,Shipped在提取过程中,程序可能会遇到 OrderID 102 的 Amount 缺失情况。根据ETL工具或脚本处理错误的配置:整个提取可能失败。程序可能继续运行,但记录该特定记录的错误。该记录可能被提取,但 Amount 的值为null或为空。通常,提取的目的只是获取数据,无论好坏。数据的清洗和验证通常在转换阶段进行。因此,一个常见的结果是提取出带有缺失值标记的记录:[ {"OrderID": "101", "CustomerID": "CUST-A", "OrderDate": "2023-10-26", "Amount": "150.00", "Status": "Shipped"}, {"OrderID": "102", "CustomerID": "CUST-B", "OrderDate": "2023-10-26", "Amount": "", "Status": "Processing"}, // 注意:金额为空 {"OrderID": "103", "CustomerID": "CUST-A", "OrderDate": "2023-10-27", "Amount": "210.25", "Status": "Shipped"} ]概述本次模拟演示了从一个简单的CSV文件中提取数据。我们看到了:源数据如何表示(结构化CSV)。完全提取如何复制整个数据集。增量提取如何只针对新增或更改的数据,通常能提高效率。在提取过程中可能遇到缺失数据等基本问题,尽管处理这些问题通常推迟到转换阶段。您现在对提取过程有了更具体的认识。它旨在可靠地从数据源获取所需的原始数据,并为ETL管道中的后续步骤做好准备。接下来,我们将考察转换阶段发生的事情,在该阶段,这些原始数据将被清洗、重塑和丰富。