Delta Lake 是经过优化的存储层,为 Databricks 上湖屋中的表提供了基础。 Delta Lake 是开源软件,它使用基于文件的事务日志扩展了 Parquet 数据文件,可以处理 ACID 事务和可缩放的元数据。 Delta Lake 与 Apache Spark API 完全兼容,并且其设计能够与结构化流式处理紧密集成,让你可以轻松地将单个数据副本用于批处理和流式处理操作,并提供大规模增量处理。
Delta Lake 是 Azure Databricks 上所有操作的默认格式。 除非另有指定,否则Azure Databricks上的所有表都是 Delta Lake 表。 Databricks 是 Delta Lake 协议的原始开发商,它将持续为开源项目做出积极贡献。 Databricks 平台中的许多优化和产品都建立在 Apache Spark 和 Delta Lake 提供的保证基础之上。 有关 Azure Databricks 优化的信息,请参阅有关 Azure Databricks 的优化建议。
有关 Delta Lake SQL 命令的参考信息,请参阅 Delta Lake 语句。
Delta Lake 事务日志具有定义完善的开放协议,任何系统都可以使用该协议来读取日志。 请参阅 Delta 事务日志协议。
Delta Lake 入门
默认情况下,Azure Databricks上的所有表都是 Delta Lake 表。 无论你使用的是 Apache Spark 数据帧还是 SQL,只需使用默认设置将数据保存到湖屋,就能获得 Delta Lake 的所有优势。
请参阅关于 Delta Lake 基本操作的示例,例如创建表、读取、写入和更新数据,详细内容在 教程:创建和管理 Delta Lake 表。
有关使用 Delta Lake 的 Databricks 建议和最佳做法,请参阅 最佳做法:Delta Lake。
转换数据并将其引入 Delta Lake
Azure Databricks 提供了许多功能,用于加速并简化将数据加载到 Lakehouse 中的过程。
| 方法 | Description |
|---|---|
| 教程:使用 Lakeflow Spark 声明性管道生成 ETL 管道 | 使用 Lakeflow Spark 声明性管道生成端到端 ETL 管道。 |
| 从 Azure Data Lake Storage 设置增量引入 | 使用自动加载器和 Lakeflow Spark 声明性管道设置云存储中的增量引入。 |
| 流式处理表 | 在 Lakeflow Spark 声明式管道中,使用流式表实现仅追加摄取和低延迟流处理。 |
| 什么是自动加载程序? | 随着文件陆续到达,对云存储中的文件进行增量摄取。 |
| 使用文件上传创建或修改表 | 从 Azure Databricks UI 上传文件并创建表。 |
| 以增量方式将 Parquet 和 Apache Iceberg 表克隆到 Delta Lake | 以增量方式将 Parquet 或 Apache Iceberg 表克隆到 Delta Lake。 |
| 转换为 Delta Lake | 将 Parquet 或 Apache Iceberg 表一次性转换为 Delta Lake。 |
| 技术合作伙伴 | 将第三方合作伙伴和工具连接到 Azure Databricks lakehouse。 |
有关引入选项的完整列表,请参阅 Lakeflow Connect 中的标准连接器。
更新和修改 Delta Lake 表
使用 Delta Lake 的原子事务,可以使用许多选项来更新数据和元数据。 为了避免损坏表,Databricks 建议避免与 Delta Lake 文件目录中的数据和事务日志文件直接交互。
| Operation | Description |
|---|---|
| 使用 merge 向 Delta Lake 表执行 Upsert | 使用合并操作将数据向上插入 Delta Lake 表。 |
| 选择性地使用 Delta Lake 覆盖数据 | 根据筛选条件和分区覆盖部分数据。 |
| 更新表架构 | 在不重写数据的情况下手动或自动更新表架构。 |
| 使用 Delta Lake 列映射重命名和删除列 | 重命名或删除列而不重写数据。 |
Delta Lake 上的增量和流式处理工作负载
Delta Lake 已针对 Azure Databricks 上的结构化流式处理进行优化。 Lakeflow Spark 声明式管道在内置功能的基础上,进一步提供了简化的基础设施部署、增强的扩展能力以及托管式数据依赖关系。
| 功能 / 特点 | Description |
|---|---|
| Delta Lake 表流式处理读取和写入 | 将 Delta Lake 表用作结构化流的源和接收器,并配合 readStream 和 writeStream 使用。 |
| 在 Azure Databricks 上使用变更数据馈送 | 跟踪 Delta Lake 或 Apache Iceberg v3 表各版本之间的行级变更。 |
查询表的旧版本
每次写入 Delta Lake 表都会创建一个新的表版本。 可以使用事务日志来查看对表的修改以及查询旧的表版本。 请参阅 “使用表历史记录”。
Delta Lake 架构增强
Delta Lake 在写入时会验证架构,确保写入到表中的所有数据都符合你设置的要求。
| 功能 / 特点 | Description |
|---|---|
| 架构强制 | 通过在写入时强制实施架构来验证数据质量。 |
| Azure Databricks 的约束 | 应用强制完整性约束以及信息性主键约束、外键约束和唯一约束。 |
| Delta Lake 生成的列 | 使用用户指定的函数自动生成列值。 |
| 使用自定义元数据扩充表 | 向表和列添加注释和自定义元数据以扩充数据发现。 |
使用 Delta Lake 管理文件和为数据编制索引
Azure Databricks 为 Delta Lake 设置了许多默认参数,这些参数会影响数据文件的大小和历史记录中保留的表版本数量。 Delta Lake 结合使用元数据分析和物理数据布局来减少为了执行任何查询而要扫描的文件数量。
| 功能 / 特点 | Description |
|---|---|
| 对表格使用液体聚类 | 简化数据布局并优化查询性能,而无需使用液体聚类分析进行分区。 |
| 数据跳过 | 使用列统计信息、Z 顺序和优化的数据布局在查询时跳过不相关的文件。 |
| 优化数据文件布局 | 压缩小型数据文件以提高查询性能。 |
| 使用 vacuum 来删除未使用的数据文件 | 删除过时数据文件以降低存储成本。 |
| 控制数据文件大小 | 手动控制目标文件大小或启用自动文件大小优化。 |
配置和查看 Delta Lake 设置
Azure Databricks 将 Delta Lake 表的所有数据和元数据存储在云对象存储中。 许多配置可以在表级别或者在 Spark 会话中设置。 可以查看 Delta Lake 表的详细信息,以发现配置了哪些选项。
| 功能 / 特点 | Description |
|---|---|
| 查看包含描述详细信息的表详细信息 | 使用 DESCRIBE DETAIL 命令查看表配置和元数据。 |
| 表格属性参考 | 可用于 Delta Lake 表的表属性的引用列表。 |
使用 Delta Lake 和 Lakeflow Spark 声明式管道构建的数据管道
Azure Databricks 鼓励用户在清理和扩充数据时利用奖牌式体系结构通过一系列表处理数据。 Lakeflow Spark 声明性管道 通过优化的执行和自动化基础结构部署和缩放来简化 ETL 工作负荷。
Delta Lake 的功能兼容性
并非所有 Databricks Runtime 版本都包含所有 Delta Lake 功能。 有关 Delta Lake 版本控制的信息,请参阅 Delta Lake 功能兼容性和协议。
Delta Lake API 文档
对于 Delta Lake 表上的大多数读取和写入操作,可以使用 Spark SQL 或 Apache Spark 数据帧 API。
有关特定于 Delta Lake 的 SQL 语句,请参阅 Delta Lake 语句。
Azure Databricks 可确保与 Databricks Runtime 中的 Delta Lake API 的二进制兼容性。 若要查看每个 Databricks Runtime 版本中打包的 Delta Lake API 版本,请参阅 Databricks Runtime 发行说明中相关文章的“系统环境”部分。 有关适用于 Python、Scala 和 Java 的 Delta Lake API 文档,请参阅 OSS Delta Lake 文档。