Azure Databricks 上的数据转换是什么?

数据转换是将数据转换、清理和构造为可用格式的过程。 数据转换通常遵循 Databricks 奖牌体系结构,以增量方式将数据从原始格式细化为企业可使用的格式。

下图显示了一个数据管道,其中包含一系列数据转换,在本示例中,它通过删除没有客户名称的客户数据,将 raw_customers 数据集转换为 clean_customers 数据集。 通过删除美元价值为零的交易,将 raw_transactions 数据转换为 clean_transactions。 生成的数据集名为 sales_report,是 clean_customersclean_transactions 的联接结果。 分析师可以使用 sales_report 实现分析和商业智能。

数据转换示例

本文重点介绍定义“转换”,因为它们与 ETL 或 ELT 中的 T 相关。 Apache Spark 处理模型还以相关方式使用“转换”一词。 请参阅 Databricks 如何针对 Apache Spark 进行优化?

数据转换的类型

Databricks 考虑两种类型的数据转换:声明式和过程式。 可以使用任一范例来表达前面示例中的数据管道。

声明式转换注重预期结果而不是如何实现它。 你可以使用更高级别的抽象来指定转换逻辑,而 DLT 可以确定执行该转换的最有效方式。

过程式数据转换注重于通过显式指令执行计算。 这些计算定义了处理数据的操作的确切顺序。 过程式方法对执行提供更好的控制度,但代价是复杂性和维护成本都会提高。

在声明式与过程式数据转换之间做出选择

对于以下情况,最好使用 DLT 进行声明式数据转换:

  • 需要快速开发和部署。
  • 数据管道具有标准模式,不需要对执行进行低级控制。
  • 需要内置的数据质量检查。
  • 维护和可读性的优先级最高。

对于以下情况,最好使用 Apache Spark 代码进行过程式数据转换:

  • 要将现有的 Apache Spark 代码库迁移到 Databricks。
  • 需要对执行进行精细控制。
  • 需要访问低级 API,例如 MERGEforeachBatch
  • 需要将数据写入 Kafka 或外部 Delta 表。

流式处理和批处理之间有哪些区别?

虽然流式处理和批处理在 Azure Databricks 上使用了很多相同的语法,但每个语法都有其自己的特定语义。

批处理允许定义显式指令,以将固定数量的静态非更改数据作为单个操作进行处理。

通过流处理,可以针对未绑定且持续增长的数据集来定义查询,然后以小型增量批处理处理数据。

Azure Databricks 上的批处理操作使用 Spark SQL 或 DataFrame,而流处理则利用结构化流式处理。

可以通过查看读取和写入操作来区分批处理 Apache Spark 命令与结构化流式处理,如下表所示:

Apache Spark 结构化流式处理
阅读 spark.read.load() spark.readStream.load()
写入 spark.write.save() spark.writeStream.start()

具体化视图通常符合批处理保证,尽管 DLT 可用于尽可能以增量方式计算结果。 具体化视图返回的结果始终等同于对逻辑的批量评估,但 Azure Databricks 会尽量逐步处理这些结果。

流式处理表始终以增量方式计算结果。 由于许多流式处理数据源只保留一段时间或几天的记录,流式处理表使用的处理模型会假定数据源中的每批记录只处理一次。

Azure Databricks 支持在以下用例中使用 SQL 编写流式处理查询:

  • 使用 Databricks SQL 在 Unity Catalog 中定义流式处理表。
  • 定义 DLT 管道的源代码。

还可以使用 Python 结构化流代码在 DLT 中声明流式处理表。

批处理转换

批处理转换在特定时间点对一组定义完善的数据资产进行操作。 批处理转换可能是一次性操作,但通常为定期运行的计划作业或管道的一部分,以便使生产系统保持最新。

增量转换

增量模式通常假定数据源只能追加,并且具有稳定的模式。 以下文章详细介绍了涉及更新、删除或架构更改的表在增量转换过程中的细微差别:

准实时转换

Delta Lake 擅长为查询湖屋的所有用户和应用程序提供对大量数据的准实时访问。 由于将文件和元数据写入到云对象存储会产生开销,因此许多向 Delta Lake 接收器进行写入的工作负载无法实现真正的实时延迟。

对于低延迟的流式处理应用程序,Databricks 建议选择专为实时工作负载(如 Kafka)设计的源和接收器系统。 可以使用 Azure Databricks 来扩充数据,包括聚合、跨流连接,以及将流数据与存储在湖屋中的缓慢变化维度数据进行连接。