你已成功从各种来源提取了数据,并精心转换以满足质量标准和业务需求。现在,这些经过处理的数据将去往何处?它们需要载入到目标系统,例如数据仓库、数据库或数据湖中,以便用于分析、报告或驱动应用程序。然而,你不能随意倾倒数据。目标系统对数据如何组织有特定的结构和规则。这种结构由目标模式定义。将模式看作数据目的地的蓝图。它规定了布局、允许的数据类型以及必须遵守的约束。在尝试执行‘载入’步骤之前,完全了解此模式是十分重要的。目标模式由哪些部分组成?关系型数据库或数据仓库是ETL的常见目标,其模式通常定义以下元素:表: 它们是存放数据的主要结构,按行和列组织,非常像电子表格。例如,你可能有存放客户、产品和订单的表。列(或字段): 每张表都由列组成,代表数据的特定属性。对于客户表,列可能包含customer_id、first_name、last_name、email和registration_date。数据类型: 每列都分配有特定的数据类型,它规定了可以存储的数据种类。常见类型包括INTEGER(整数)、VARCHAR(可变长度文本)、CHAR(固定长度文本)、DATE(日期)、TIMESTAMP(时间戳)、BOOLEAN(布尔值,真/假)以及DECIMAL或NUMERIC(用于带有小数部分的数字,例如货币)。数据类型通常包含大小限制,例如VARCHAR(100)表示最多100个字符的文本。约束: 这些是应用于列或表的规则,用于确保数据完整性。示例包括:PRIMARY KEY(主键):唯一标识表中的每一行(例如,customer_id)。不能为null。FOREIGN KEY(外键):将一个表中的列链接到另一个表中的PRIMARY KEY,强制执行关系(例如,将orders.customer_id链接到customers.customer_id)。NOT NULL(非空):确保列必须始终有值;它不能是空的。UNIQUE(唯一):确保列中的所有值在不同行之间是唯一的。CHECK(检查):强制执行特定条件(例如,order_quantity > 0)。目标模式的可视化让我们来看一个数据库中orders表的简单模式示例:digraph TargetSchema { node [shape=plaintext]; table [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0" BGCOLOR="#e9ecef"> <TR><TD COLSPAN="3" BGCOLOR="#74c0fc"><B>表:`orders`</B></TD></TR> <TR><TD BGCOLOR="#ced4da"><B>列名</B></TD><TD BGCOLOR="#ced4da"><B>数据类型</B></TD><TD BGCOLOR="#ced4da"><B>约束</B></TD></TR> <TR><TD>`order_id`</TD><TD>INTEGER</TD><TD>PRIMARY KEY</TD></TR> <TR><TD>`customer_id`</TD><TD>INTEGER</TD><TD>FOREIGN KEY (引用 `customers`)</TD></TR> <TR><TD>`order_date`</TD><TD>DATE</TD><TD>NOT NULL</TD></TR> <TR><TD>`total_amount`</TD><TD>DECIMAL(10, 2)</TD><TD>NULL</TD></TR> </TABLE> >]; }一个图表,代表orders表的模式,展示了列名、它们的数据类型以及应用的主键和外键等约束。在此示例中:该表名为orders。order_id是整数,并用作主键,这意味着每个订单都必须具有唯一的ID。customer_id是链接到customers表的整数。order_date必须是有效的日期,并且不能留空(NOT NULL)。total_amount是一个十进制数字,总共允许最多10位数字,其中小数点后有2位(适用于货币)。它可以留空(NULL)。模式为何对载入十分重要目标模式在载入过程中充当守门员。你转换后的数据必须严格遵守此模式:结构对齐: 你转换后数据集中的列必须与目标表中的列对应。你需要知道哪个源列对应哪个目标列(这将在模式映射中说明)。数据类型兼容性: 你转换后数据的数据类型必须与目标列的数据类型兼容。尝试将“Expensive”之类的文本载入到total_amount(DECIMAL)列中会引起错误。同样,如果目标系统要求'YYYY-MM-DD'格式,将“2023-Feb-28”载入到order_date(DATE)列中可能会失败。约束符合性: 数据必须满足所有定义的约束。由于NOT NULL约束,你不能载入没有order_date的订单记录。由于PRIMARY KEY约束,你不能载入order_id已存在的订单。如果customer_id是外键,你通常不能载入在customers表中不存在customer_id的订单。大小限制: 文本数据不得超过定义的长度(例如,VARCHAR(100))。载入超出限制的文本可能会导致错误或数据截断(字符丢失),具体取决于系统配置。忽视目标模式就像是试图将方钉硬塞进圆孔。这必然会导致载入过程中的问题。错误可能包括载入作业失败、数据被拒绝、数据截断,或者如果类型转换隐式发生但有误,则可能出现数据损坏。因此,在开始任何数据载入之前,你必须完全了解目标系统模式的结构、数据类型和约束。这些信息指导转换阶段的最后步骤(确保数据类型和格式与目标匹配),并且对于正确配置载入过程十分重要。下一节“模式映射”将基于此了解直接进行说明,阐明如何明确地将转换后的数据字段连接到目标模式列。