Leer en inglés

Compartir a través de

Delta 表上的低随机合并优化

Delta Lake MERGE 命令 允许用户使用高级条件更新增量表。 它可以使用 MERGE 命令将源表、视图或 DataFrame 中的数据更新到目标表中。 但是,当前算法未完全优化,无法处理未修改的 。 通过低随机合并优化,未修改的行被排除在更新匹配行所需的昂贵洗牌作之外。

为什么我们需要低随机合并

目前,MERGE作由两个 Join 执行完成。 第一个联接是使用整个目标表和源数据来查找目标表 触摸 文件的列表,包括任何匹配的行。 之后,它将执行第二个联接,只读取 触摸的 文件和源数据,以执行实际的表更新。 尽管第一个联接是减少第二个联接的数据量,但 触摸的 文件中,仍有大量 未修改的 行。 第一个联接查询比较轻,因为它只读取给定匹配条件中的列。 表更新的第二个列需要加载所有列,这会产生昂贵的洗牌过程。

使用低随机合并优化,Delta 会暂时保留第一个联接的匹配行结果,并将其用于第二个联接。 根据结果,它会从繁重的混排过程中排除 未修改的 行。 匹配的 行和 未修改的 行将有两个单独的写入作业,因此,与以前的行为相比,这可能会导致输出文件数的 2 倍。 但是,预期的性能提升超过了可能出现的小文件问题。

可用性

Nota

  • 低随机合并可用作预览功能。

它适用于 Apache Spark 版本 3.2 和 3.3 的 Synapse 池。

版本 可用性 违约
Delta 1.2 / Spark 3.2 是的
Delta 2.2 / Spark 3.3 是的

低随机合并的优点

  • 触摸 文件中未修改的行是单独处理的,不会经历实际的 MERGE作。 它可以节省整个 MERGE 执行时间和计算资源。 当复制许多行并且仅更新几行时,增益会更大。
  • 为未修改的行保留行顺序。 因此,如果文件已排序或 Z-ORDERED,则未修改行的输出文件对于跳过数据仍然有效。
  • 即使合并条件与所接触文件中的所有行匹配,也会产生很小的开销。

如何启用和禁用低随机合并

为池或会话设置配置后,所有 Spark 写入模式都将使用该功能。

若要使用低随机合并优化,请使用以下配置启用它:

  1. Scala 和 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true

若要检查当前配置值,请使用如下所示的命令:

  1. Scala 和 PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`

若要禁用该功能,请更改以下配置,如下所示:

  1. Scala 和 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false