您已成功提取数据并对其进行了转换,以完成清洗、构建和丰富。数据现在已准备好传送到其最终目的地。但是,在实际加载开始之前,有一个重要步骤:确保数据完全符合目标系统(如数据库表或数据仓库维度)的结构或模式。这就是模式映射的作用。将您转换后的数据视为准备装载到船只(您的目标系统)上的货物。船只具有为特定类型货物设计的特定容器(字段或列)。模式映射是装载清单;它清楚地告知装载人员,哪一部分转换后的数据应放入船上的哪个容器。没有此映射,数据可能会进入错误的位置、被误解,或完全无法加载。什么是模式映射?模式映射是定义转换后的源数据字段与目标系统模式中字段之间对应关系的过程。它充当一个转换层,确保每部分数据都能在目的地找到其正确位置。想象一下,一份已转换的客户数据拥有 customer_id、first_name、last_name 和 signup_date 等字段。您的目标数据仓库表 DimCustomer 可能包含名为 CustomerID、FirstName、LastName 和 RegistrationTimestamp 的列。模式映射定义了这些连接:customer_id (源) 映射到 CustomerID (目标)first_name (源) 映射到 FirstName (目标)last_name (源) 映射到 LastName (目标)signup_date (源) 映射到 RegistrationTimestamp (目标)为什么映射是必要的?数据很少能在没有指导的情况下,从源转换输出完美地流入目标系统输入。映射是必要的,原因如下:字段命名差异: 源系统和目标系统经常对同一逻辑数据片段使用不同的命名约定(例如,user_email 对 EmailAddress)。映射弥合了这一差距。数据类型兼容性: 源字段可能是字符串(例如,“2023-10-26”),但目标字段需要特定的日期数据类型。映射过程可以包含类型转换指令,确保数据符合目标模式的要求。例如,将 '20231026'(源字符串)映射到 OrderDate(目标日期类型)需要一个转换函数。结构调整: 有时在加载过程中需要进行微小结构调整。组合字段: 您可能将 source.area_code 和 source.phone_number 映射到单个 target.PhoneNumber 字段。拆分字段: 单个 source.full_address 可能需要映射到单独的 target.Street、target.City 和 target.ZipCode 字段。忽略字段: 并非所有转换后的字段都可能在目标中需要。映射允许您只选择相关字段。添加默认值或计算值: 如果源数据缺失,映射规则可以为目标字段指定默认值(例如,如果未提供状态,则将 target.Status 设置为“待处理”)。它们还可以根据源字段定义简单的计算。例如,如果目标需要 TotalPrice 字段,映射可以根据源字段定义它:$总价 = 数量 \times 单价$。常见映射情景让我们看看您会遇到的典型映射模式:直接映射(一对一): 最简单的形式。单个源字段直接映射到单个目标字段,可能伴随名称更改。source.product_id -> target.ProductID数据类型转换: 如前所述,转换数据类型以匹配目标。source.order_total (字符串) -> target.OrderTotal (小数)连接(组合): 将多个源字段连接到一个目标字段。source.first_name, source.last_name -> target.FullName(例如,使用 target.FullName = source.first_name + ' ' + source.last_name 这样的规则)分解(拆分): 将单个源字段拆分为多个目标字段。source.timestamp (日期时间) -> target.Date, target.Time常量/默认值: 为目标字段分配固定值,常用于元数据或状态标志。'Processed' -> target.RecordStatus表达式/派生值: 使用公式或简单逻辑根据一个或多个源字段计算目标字段的值。source.price, source.tax_rate -> target.PriceWithTax(例如,使用 $含税价格 = 价格 \times (1 + 税率)$)查找: 通过将源键映射到在另一个表或参考数据集中查找的值来丰富数据(尽管复杂的查找通常在转换阶段处理)。一个简单的情况可能是将国家代码映射到国家名称。source.country_code(例如,'US')-> target.CountryName(例如,'United States')通过查找表。定义映射您在ETL过程中实际如何定义这些映射?这取决于您使用的工具和技术:带GUI的ETL工具: 许多可视化ETL工具提供图形界面,您可以在源字段和目标字段之间拖动线条来创建映射。它们通常内置用于常见转换的组件,如类型转换或连接。配置文件: 映射可以在JSON、YAML或XML等结构化文件中定义。这种方法在基于代码的ETL框架中很常见,允许映射与代码一起进行版本控制。代码/脚本: 在自定义ETL脚本中(例如,使用Python),映射通常直接在代码中定义,可能使用字典或专用映射函数。例如:# 映射的Python字典示例 mapping_rules = { 'CustomerID': 'source_data.user_id', 'Email': 'source_data.email_address', 'RegistrationDate': 'convert_to_date(source_data.signup_dt)', 'Status': "'Active'" # 分配一个默认字符串值 }示例:客户数据映射让我们通过一个例子来巩固这一点。假设您的转换数据如下所示(按行):用户ID名姓注册日期城市省份101AliceSmith2023-01-15T10:00ZNewarkNJ102BobJones2023-02-20T14:30ZTrentonNJ您的目标数据库表 Customers 具有以下结构:CustID (整数, 主键)FullName (字符串)Location (字符串)RegisteredDate (日期)IsActive (布尔值)模式映射规则可能如下:user_id -> CustID (直接映射,可能进行从字符串/数字到整数的类型转换)f_name, l_name -> FullName (用空格组合:f_name + ' ' + l_name)city, state -> Location (用逗号组合:city + ', ' + state)registered_on -> RegisteredDate (提取日期部分,转换为日期类型)(无源字段) -> IsActive (分配默认值:True)这是说明这些映射的图表:digraph G { rankdir=LR; node [shape=record, style=filled, fillcolor="#dee2e6"]; edge [color="#495057"]; subgraph cluster_source { label = "转换后的源数据"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#a5d8ff"]; // Blueish Source [label="{user_id|f_name|l_name|registered_on|city|state}"]; } subgraph cluster_target { label = "目标表:客户"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#b2f2bb"]; // Greenish Target [label="{CustID|FullName|Location|RegisteredDate|IsActive}"]; } subgraph cluster_rules { label = "映射规则"; bgcolor="#ffec99"; // Yellowish style=filled; node [shape=plaintext, fontcolor="#495057"]; Rule1 [label="直接映射 + 类型转换"]; Rule2 [label="组合:f_name + ' ' + l_name"]; Rule3 [label="组合:city + ', ' + state"]; Rule4 [label="提取日期 + 类型转换"]; Rule5 [label="默认值:True"]; } Source:f0 -> Rule1 [label="1"]; Rule1 -> Target:f0; Source:f1 -> Rule2 [label="2a"]; Source:f2 -> Rule2 [label="2b"]; Rule2 -> Target:f1; Source:f4 -> Rule3 [label="3a"]; Source:f5 -> Rule3 [label="3b"]; Rule3 -> Target:f2; Source:f3 -> Rule4 [label="4"]; Rule4 -> Target:f3; Rule5 -> Target:f4 [label="5"]; }映射规则将转换后的源数据结构中的字段连接到目标表结构,包括组合和默认值。处理映射难题映射通常是直接的,但也可能带来难题:源字段缺失: 如果映射中使用的源字段在特定记录中不存在,会发生什么?您的映射逻辑或ETL工具需要一个策略:跳过记录、加载 NULL、加载默认值或引发错误。映射验证: 在运行大量加载之前,请确保您的映射正确。这里的错误可能导致数据损坏或加载失败。使用样本数据测试映射。模式演变: 源或目标模式可能随时间变化。必须更新映射以反映这些变化。保持映射可维护性(例如,在配置文件或有良好文档的代码中)很重要。模式映射是数据加载前的最后对齐步骤。它确保清洗、转换后的数据精确符合目标系统的结构和要求,从而使后续加载过程更顺畅,并使生成的数据准确且可用于分析。