转换数据
本文介绍和概述如何使用 Azure Databricks 转换数据。 转换数据或准备数据是所有数据工程、分析和 ML 工作负载的关键步骤。
本文中的示例模式和建议侧重于使用由 Delta Lake 提供支持的湖屋表。 由于 Delta Lake 提供 Databricks lakehouse 的 ACID 保证,因此在使用其他格式或数据系统的数据时,你可能会观察到不同的行为。
Databricks 建议将数据引入原始或几乎为原始状态的 Lakehouse,然后将转换和扩充作为单独的处理步骤应用。 此模式称为奖牌体系结构。 请参阅什么是奖牌湖屋体系结构?。
如果知道需要转换的数据尚未加载到湖屋中,请参阅将数据引入 Databricks 湖屋。 如果尝试查找湖屋数据来写入转换,请参阅“发现数据”。
所有转换首先针对数据源编写批处理或流式处理查询。 如果对查询数据不熟悉,请参阅“查询数据”。
将数据保存到 Delta 表后,可以将该表用作 ML 的功能表。 请参阅特征工程和服务。
备注
此处的文章讨论有关 Azure Databricks 的转换。 Azure Databricks 还支持连接到许多常见的数据准备平台。 请参阅使用 Partner Connect 连接到数据准备合作伙伴。
本文重点介绍定义“转换”,因为它们与 ETL 或 ELT 中的 T 相关。 Apache Spark 处理模型还以相关方式使用“转换”一词。 简言之:在 Apache Spark 中,所有操作都定义为转换或操作。
- 转换:向计划添加一些处理逻辑。 相关示例包括读取数据、联接、聚合和类型强制转换。
- 操作:触发处理逻辑来评估和输出结果。 相关示例包括写入、显示或预览结果、手动缓存或获取行计数。
Apache Spark 使用延迟执行模型,这意味着在触发操作之前,不会计算由操作集合定义的逻辑。 定义数据处理管道时,此模型具有重要的影响:仅使用操作将结果保存回目标表。
由于操作表示优化逻辑的处理瓶颈,因此 Azure Databricks 在 Apache Spark 中已存在的优化的基础上添加了大量优化,以确保优化逻辑的执行。 这些优化将考虑由给定操作同时触发的所有转换,并根据数据的物理布局查找最佳计划。 手动缓存数据或返回生产管道中的预览结果可能会中断这些优化,并导致成本和延迟显著增加。
因此,我们可以将湖屋转换定义为应用于一个或多个湖屋表的任何操作集合,这些操作会产生一个新的湖屋表。 请注意,尽管单独讨论了联接和聚合等转换,但可以在单个处理步骤中合并其中许多模式,并信任 Azure Databricks 上的优化器来查找最有效的计划。
虽然流式处理和批处理在 Azure Databricks 上使用了很多相同的语法,但每个语法都有其自己的特定语义。
批处理允许定义显式指令,以将固定数量的静态非更改数据作为单个操作进行处理。
通过流处理,可以针对未绑定且持续增长的数据集来定义查询,然后以小型增量批处理处理数据。
Azure Databricks 上的批处理操作使用 Spark SQL 或 DataFrame,而流处理则利用结构化流式处理。
可以通过查看读取和写入操作来区分批处理 Apache Spark 命令与结构化流式处理,如下表所示:
Apache Spark | 结构化流式处理 | |
---|---|---|
读取 | spark.read.load() |
spark.readStream.load() |
写入 | spark.write.save() |
spark.writeStream.start() |
具体化视图通常符合批处理保证,尽管 Delta Live Table 可用于尽可能增量计算结果。 具体化视图返回的结果始终等同于对逻辑的批量评估,但 Azure Databricks 会尽量逐步处理这些结果。
流式处理表始终以增量方式计算结果。 由于许多流式处理数据源只保留一段时间或几天的记录,流式处理表使用的处理模型会假定数据源中的每批记录只处理一次。
Azure Databricks 支持在以下用例中使用 SQL 编写流式处理查询:
- 使用 Databricks SQL 在 Unity Catalog 中定义流式处理表。
- 定义 Delta Live Table 管道的源代码。
备注
还可以使用 Python 结构化流代码在 Delta Live Table 中声明流式处理表。
批处理转换在特定时间点对一组定义完善的数据资产进行操作。 批处理转换可能是一次性操作,但通常为定期运行的计划作业或管道的一部分,以便使生产系统保持最新。
增量模式通常假定数据源是仅追加的,并且具有稳定的架构。 以下文章详细介绍了体验更新、删除或架构更改的表的增量转换的细微差别:
- APPLY CHANGES API:使用增量实时表简化变更数据捕获
- 在 Azure Databricks 上使用 Delta Lake 更改数据馈送
- 更新 Delta Lake 表架构
- 增量表流式读取和写入
Delta Lake 擅长为查询湖屋的所有用户和应用程序提供对大量数据的近实时访问,但由于将文件和元数据写入云对象存储的开销较大,许多写入 Delta Lake 接收器的工作负荷无法达到真正的实时延迟。
对于极其低延迟的流式处理应用程序,Databricks 建议选择专为实时工作负荷(如 Kafka)设计的源和接收器系统。 可以使用 Azure Databricks 来扩充数据,包括聚合、跨流联接,以及联接流数据,以及通过缓慢更改存储在湖屋中的维度数据来联接流数据。