你已在转换阶段抽取、清理并整理好数据,使其成为理想的格式。现在,是时候将这些处理过的数据迁移到最终目的地了。最直接的方法之一就是采用完整加载策略。想象你有一块白板(你的目标表)和一系列笔记(你的转换数据)。完整加载就像完全擦除整个白板,然后将你所有的现有笔记都写上去。每次运行该过程时,你都会清空所有内容,并根据最新的转换数据重写一切。完整加载的工作原理完整加载($L_{full}$)是一种数据加载策略,用于将全部数据从源系统迁移到目标系统。此过程通常包含一些特定步骤。准备: ETL 过程完成抽取和转换步骤,生成可供加载的数据集。目标准备(可选但常见): 目标表中现有数据通常会被完全移除。这在 SQL 数据库中常用 TRUNCATE TABLE 命令完成,它通常比逐行删除(DELETE FROM table)更快。有时,表甚至可能被删除并重建,特别是当涉及模式变更时。数据加载: 整个转换后的数据集被插入到当前为空的目标表。该过程确保在加载操作完成后,目标表包含转换阶段为该次特定运行生成的数据集的准确副本。digraph FullLoad { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_etl { label = "ETL 过程"; bgcolor="#dee2e6"; style=filled; color="#adb5bd"; Extract [label="抽取数据\n(源)", shape=cylinder, fillcolor="#a5d8ff"]; Transform [label="转换数据", shape=Mdiamond, fillcolor="#96f2d7"]; Extract -> Transform [label="原始数据"]; } subgraph cluster_target { label = "目标系统"; bgcolor="#dee2e6"; style=filled; color="#adb5bd"; TargetBefore [label="目标表\n(包含旧数据)", fillcolor="#ffc9c9"]; Truncate [label="清空表\n(空表)", shape=invhouse, fillcolor="#ffd8a8"]; TargetAfter [label="目标表\n(包含新数据)", fillcolor="#b2f2bb"]; TargetBefore -> Truncate [label="清空"]; Truncate -> TargetAfter [label="加载"]; } Transform -> Truncate [label="转换数据", style=dashed]; }一张描绘完整加载过程的图表。数据被抽取并转换。目标表在加载转换后的数据之前被清空,完全替换掉之前的内容。何时使用完整加载尽管简单,完整加载并非总是最佳选择,特别是对于非常大的数据集。然而,它通常适用于以下几种情况:首次数据加载: 首次填充数据仓库或目标表时,完整加载是一种自然的方法。小型数据集: 如果数据量相对较小,擦除并重新加载所有内容可能比弄清变更内容更快、更简单。“小”是相对的,取决于你的系统性能和可接受的加载时间窗口。非重要历史数据: 如果目标系统不需要保留历史状态(例如,它只需要当前状态),完整加载会大大简化流程。缺乏变更追踪: 当源系统未提供可靠方法来识别自上次抽取以来哪些数据已变更时(例如时间戳或版本号),完整加载可能是确保目标反映当前源状态的唯一可行方式。开发和测试: 完整加载常用于开发或测试环境,因为它们易于重置并确保已知状态。维度表: 有时,数据仓库中较小的维度表(描述产品、客户或时间等业务实体的数据表)会被完整重新加载,因为它们不会变得过大,并且倾向于采用简单性。完整加载的优点简单性: 逻辑直观明了。你不需要复杂的机制来追踪变更、处理更新或管理删除。擦除并替换即可。保证一致性(加载后): 成功完整加载后,目标表在那个时间点完美映射源数据(经过转换阶段处理的)。更简单的错误恢复: 如果完整加载中途失败,你通常只需再次清空目标并重启加载过程,而无需担心部分更新问题。完整加载的缺点大型数据低效率: 每次重新加载数百万或数十亿行会消耗大量时间、网络带宽和计算资源。加载时间可能变得过长,无法接受。历史数据丢失: 由于你擦除目标数据,因此会丢失该特定表内的任何历史记录,除非你预先设计系统来归档数据。潜在停机/锁定: 清空和加载大量数据可能会锁定目标表,使其在加载过程中无法被其他应用程序读写。资源密集: 源系统和目标系统在完整加载操作期间都会承受重负载。完整加载策略提供了一种基本方法来填充目标系统。它的简单性使其具有吸引力,特别是对于小型数据集或初始加载。然而,它在处理大型数据量时的局限性常常促使数据工程师考虑其他方法,例如增量加载,我们将在后面讨论。