数据在被提取并转换成干净、一致的格式之后,下一个问题是这些处理后的数据应该去往何处?ETL的“加载”阶段就是将这些数据移动到其最终目的地,即目标系统。选择合适的目标系统是一个重要决定,它直接影响数据以后使用的便捷性和有效性。可以把它想成选择你整理好的文件存放在哪里。它们是放在用于日常使用的便于快速访问的档案柜中,还是用于研究的带有索引的大型图书馆,或者是一个可以存放任何东西的巨型存储单元?选择取决于你计划如何使用这些文件。同样,ETL过程的最佳目标系统在很大程度上取决于数据的预期用途。让我们来看看常见的目标系统类型以及指导你选择的因素。常见目标系统虽然数据技术上可以加载到几乎任何地方,但在ETL工作流中经常使用以下三大类目标系统:数据库(操作型数据库 / 关系型数据库):用途: 它们通常是运行日常业务应用程序(如记录销售、管理库存或用户账户)的系统。它们通常为事务处理进行了优化:快速写入、更新和删除单个记录。例子包括PostgreSQL、MySQL、SQL Server和Oracle。结构: 通常存储高度结构化的关系数据。在加载任何数据之前,它们会强制执行预定义结构,称为模式(写入时模式)。在ETL中的用途: 有时用作较小数据集、特定应用需求或操作报告的目标,需要直接从源系统副本或紧密关联的数据库获取接近实时的数据。然而,它们通常不适合业务智能中常见的复杂分析查询。数据仓库:用途: 专门为数据分析和商业智能(BI)设计和优化。它们将来自各种来源的数据整合到单一、一致的存储库中,专为复杂查询和报告定制。例子包括Snowflake、Google BigQuery、Amazon Redshift和Azure Synapse Analytics。结构: 主要存储结构化和半结构化数据。虽然它们强制执行模式,但这些模式的设计通常与操作型数据库不同(例如,使用维度建模),以加速对大型历史数据集的分析查询。在ETL中的用途: 传统ETL管道最常见的目标,旨在支持BI仪表板、报告和数据分析。它们为聚合和分析大量历史数据提供了出色的查询性能。数据湖:用途: 设计用于以其原始或原生格式存储海量数据。可以将其视为大型存储库,能够经济高效地存储结构化、半结构化(如JSON、XML)和非结构化数据(如文本文件、图像)。例子包括在Amazon S3、Google Cloud Storage或Azure Data Lake Storage (ADLS)中存储文件。结构: 高度灵活。它们在加载数据之前通常不需要预定义模式(读取时模式)。你在读取或查询数据时定义结构。在ETL中的用途: 当你需要存储大量不同类型的数据时,尤其是在确切用途尚未明确的情况下,数据湖常被用作目标。当数据用于数据科学分析或训练可能需要原始或较少处理的机器学习模型时,它们也是常见的目标。数据稍后可能会从数据湖进一步处理到数据仓库中。影响你选择的因素在数据库、数据仓库或数据湖之间进行选择并非总是简单明了。以下是几个需要考虑的因素:数据的预期用途: 这通常是最重要的因素。需要数据用于复杂报告和BI仪表板? 数据仓库很可能是最合适的选择。需要为操作性应用程序或简单报告提供支持? 数据库可能就足够了。需要存储海量原始数据以用于未来分析、数据科学或多种分析? 数据湖是一个强有力的选择。需要支持机器学习模型? 数据湖通常用作数据源,有时会将处理后的数据馈送到特征存储或数据仓库。数据结构和多样性:主要是结构化数据(表、行、列)? 数据库和数据仓库原生支持这种情况。结构化、半结构化和非结构化数据的混合? 数据湖提供最大的灵活性。数据仓库也越来越多地增加对半结构化数据的支持。数据量:中小型数据集? 操作型数据库可能可以处理。大型到超大型数据集(TB、PB)? 数据仓库和数据湖专为规模化而构建。数据湖对于存储超大数据量通常更具成本效益。查询性能需求:需要复杂分析查询(例如:聚合多年销售数据)的快速响应? 数据仓库为此进行了优化。需要快速查找或更新单个记录? 操作型数据库在这方面表现出色。查询性能需求各异,或者愿意牺牲一些速度换取灵活性? 数据湖通常需要计算引擎(如Spark、Presto或AWS Athena、BigQuery Omni等服务)才能有效查询,且性能取决于引擎和数据组织方式。模式要求:需要预先定义的严格强制结构? 数据库和数据仓库强制执行写入时模式。需要先加载数据后定义结构的灵活性? 数据湖提供读取时模式。成本:存储和计算成本差异很大。云数据湖通常提供非常低的存储成本。云数据仓库将存储和计算成本分离,允许根据需求进行扩展。操作型数据库除了硬件/云基础设施成本之外,还可能有许可费用。现有基础设施和技能:你的组织目前使用哪些系统?你的团队熟悉SQL(数据库和数据仓库常见)还是Spark等工具(数据湖常见)?善用现有投资和技能可以更高效。以下是一个简单的图表,说明了决策流程:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial", fontsize=10, color="#495057", fillcolor="#e9ecef", style="filled,rounded"]; edge [fontname="Arial", fontsize=9, color="#495057"]; transformed_data [label="转换后的数据"]; decision [label="主要用途是什么?", shape=diamond, fillcolor="#ffec99", color="#f59f00"]; db [label="操作型数据库", fillcolor="#a5d8ff", color="#1c7ed6"]; dw [label="数据仓库", fillcolor="#b2f2bb", color="#37b24d"]; dl [label="数据湖", fillcolor="#bac8ff", color="#4263eb"]; transformed_data -> decision; decision -> db [label="操作用途 / 应用输入\n (结构化,中等数据量)"]; decision -> dw [label="分析 / BI报告\n (结构化/半结构化,大数据量)"]; decision -> dl [label="原始存储 / 机器学习 / 分析\n (任意结构,超大数据量)"]; }基于主要数据用途和特性选择目标系统的决策路径。做出周全的选择,确保提取和转换数据所付出的努力得到回报,使数据随时可用并能有效服务于其预期目的。在接下来的部分中,我们将了解如何实际将数据加载到这些选定的系统中。