您已成功连接到数据源。下一个重要问题是:每次抽取运行时应该提取多少数据?是每次都提取所有数据,还是只提取新增或变更的部分?这一选择带来了两种基本的抽取策略:完全抽取和增量抽取。了解全量提取和增量提取之间的区别以及何时使用每种方法,是构建高效且易于管理的 ETL 管道不可或缺的。完全抽取:全部获取完全抽取顾名思义:每次 ETL 过程运行时,它都会从源系统中抽取全部数据集。就像每次需要检查更新时都影印整本书一样,即使只有几个字发生了改变。工作原理: 该过程只是连接到源,并提取您感兴趣的表或文件的所有可用记录。如果目标系统已包含上次运行的数据,则完全抽取通常涉及在载入新抽取的完整数据集之前,删除(截断)旧数据。何时使用完全抽取:首次数据载入: 当您首次设置 ETL 管道并需要第一次填充目标系统(例如数据仓库)时,完全抽取通常是必需的。小型数据集: 如果源数据集相对较小(取决于您的系统,可能是数千或数万条记录),则完全抽取的额外开销可能可以忽略不计。它通常比增量逻辑更容易实现。数据复制需求: 有时,您需要源数据在特定时间点的精确副本,在重新载入前清空目标数据可以确保这一点。源系统限制: 如果源系统不提供可靠的变更追踪方式(如时间戳或版本号),完全抽取可能是您唯一的选择。完全抽取的缺点:性能: 提取大量数据可能会很慢,并消耗源系统和 ETL 系统上的大量计算资源。网络负载: 通过网络传输大型数据集可能造成拥塞并耗费很长时间。源系统影响: 频繁运行大型查询可能会对源数据库或应用程序造成沉重负担,从而可能影响其对操作用户服务的性能。耗时: 整个过程耗时较长,如果您需要频繁更新目标系统中的数据,这可能不适用。增量抽取:只提取变更增量抽取采用更精细的方法。它不是提取所有数据,而是只识别和提取自上次抽取运行以来已添加或修改的数据。回到图书的比喻,这就像只影印上次复制后有改动过的页面。工作原理: 此方法依赖于能够检测源数据中的变更。常见技术包括:时间戳: 许多数据库表都有记录行最后修改时间的列(例如,last_updated_at、modification_date)。ETL 过程会记录上次成功抽取的时间戳,在下一次运行时,只抽取时间戳晚于所记录时间戳的行。版本号或序列 ID: 有些系统会给事务或记录分配递增的数字或唯一 ID。您可以追踪上次处理的 ID,并只获取 ID 更高的记录。状态标志: 有时,记录带有状态标志(例如,is_processed、needs_sync),表明它们是否需要被抽取。ETL 过程会抽取带有特定标志的记录,并在成功抽取后可能更新该标志。变更数据捕获 (CDC): 这是一组更先进的技术,源数据库本身会在变更发生时记录这些变更(插入、更新、删除)。专门的 CDC 工具或数据库功能随后可以读取这些日志以高效捕获变更,通常延迟非常低。我们将在本章后面提及 CDC 的一些内容。何时使用增量抽取:大型数据集: 在处理包含数百万或数十亿条记录的表时,只抽取变更会比完全抽取高效得多。频繁更新: 如果数据需要频繁(例如,每小时或更频繁)刷新到目标系统中,增量抽取通常是唯一可行的办法。资源限制: 它减少了源系统、网络和 ETL 处理引擎的负载。近实时要求: 基于 CDC 的增量抽取可以实现数据管道以极低延迟运行,从源端发生变更到其反映在目标端之间的时间很短。增量抽取的缺点:复杂度: 实现可靠检测变更的逻辑可能比简单地选择所有数据更复杂。您需要在源系统中有一个可靠的机制(时间戳、ID、CDC)。处理删除: 检测删除的记录可能很棘手。时间戳通常只追踪插入和更新。通常需要 CDC 系统或特定的应用逻辑(如使用标志的“软删除”)来捕获删除。数据丢失的可能: 如果变更检测机制不够完全可靠,或者 ETL 运行中途失败,则有遗漏一些变更的风险。需要细致的错误处理和状态管理。对源的依赖: 其有效性严重依赖于源系统变更追踪机制的功能和可靠性。比较两种方法这是一个描述主要区别的简单图示:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [fontname="sans-serif", color="#495057"]; subgraph cluster_full { label = "完全抽取"; bgcolor="#e7f5ff"; // 浅蓝色背景 style=filled; color="#a5d8ff"; f_source [label="源\n(所有数据)"]; f_extract [label="抽取\n所有数据", fillcolor="#ffc9c9"]; // 偏红,表示操作繁重 f_target [label="目标\n(替换)"]; f_source -> f_extract -> f_target [label="第 1 次运行"]; f_source -> f_extract -> f_target [label="第 2 次运行", style=dashed]; } subgraph cluster_incremental { label = "增量抽取"; bgcolor="#e6fcf5"; // 浅绿色背景 style=filled; color="#96f2d7"; i_source [label="源\n(新增/变更数据)"]; i_extract [label="仅抽取\n变更", fillcolor="#b2f2bb"]; // 偏绿,表示操作高效 i_target [label="目标\n(追加/更新)"]; i_source -> i_extract -> i_target [label="第 1 次运行 (例如,记录 1-10)"]; i_source -> i_extract -> i_target [label="第 2 次运行 (例如,记录 11-15)", style=dashed]; } }该图对比了每次提取所有数据、导致目标数据被替换的完全抽取,与只提取新增或变更数据、允许在目标中进行追加或更新的增量抽取。选择正确的策略:完全抽取和增量抽取之间的决定并非总是明确的,通常取决于:数据量: 数据集有多大?(大 -> 增量)变更频率: 数据变更的频率有多高?(频繁 -> 增量)源系统能力: 源是否支持可靠的变更追踪?(否 -> 完全,是 -> 增量)目标要求: 目标数据需要有多高的实时性?(近实时 -> 增量)开发复杂度: 您愿意管理多高的复杂度?(简单 -> 完全)在许多情况下,您可能会组合使用:执行初始完全抽取来填充目标系统,然后切换到增量抽取进行持续更新。了解这两种方法使您能够选择最适合 ETL 管道中每个特定数据源的技术。