Azure Databricks 上的低随机合并

注意

低洗牌合并在 Databricks Runtime 10.3 及更高版本以及 Databricks Runtime 9.1 LTS 的公共预览版正式发布 (GA)。 建议预览版客户迁移到 Databricks Runtime 10.3 或更高版本。

MERGE 命令用于从 Delta Lake 表执行同时更新、插入和删除。 Azure Databricks 具有优化的 MERGE 实现,可以通过减少随机操作的数量来显著提高常见工作负载的性能。

Databricks 低随机合并通过以单独的、更简化的处理模式处理未修改的行,而不是将它们与修改的行一起处理,来提供更好的性能。 因此,随机数据量显著减少,从而提高性能。 低随机合并还减少了用户在执行 MERGE 操作后重新运行 OPTIMIZE ZORDER BY 命令的需要。

优化的性能

许多 MERGE 工作负载仅更新表中相对较少的行。 但是,Delta 表只能按每个文件进行更新。 当 MERGE 命令需要更新或删除特定文件中存储的少量行时,它还必须处理和重写存储在同一文件中的所有剩余行,即使这些行未经修改。 低随机合并优化未修改行的处理。 以前,它们的处理方式与已修改行相同,通过多个随机阶段和昂贵的计算传递。 在低随机合并中,未修改行的处理则无需任何随机重组、昂贵的处理或增加其他开销。

优化的数据布局

除了运行速度更快,低随机合并还有利于后续操作。 较早的 MERGE 实现造成了未修改数据的数据布局完全更改,导致后续操作的性能较低。 低随机合并会尝试保留未修改记录的现有数据布局,包括按“尽力而为”的原则执行的 Z 顺序优化。 因此,使用低随机合并时,在运行一个或多个 MERGE 命令后,对 Delta 表的操作性能将会缓慢下降。

注意

低随机合并会尝试保留未修改的现有数据的数据布局。 更新或新插入数据的数据布局可能并非最佳,因此可能仍然需要运行 OPTIMIZEOPTIMIZE ZORDER BY 命令。

可用性

默认情况下,低随机合并在 Databricks Runtime 10.4 和更高版本中处于启用状态。 在早期的受支持的 Databricks Runtime 版本中,可以通过将配置 spark.databricks.delta.merge.enableLowShuffle 设置为 true 来启用它。 此标志在 Databricks Runtime 10.4 及更高版本中不起作用。