使用键的数据帧从 DeltaTable 中删除

ksc*_*ath 1 scala apache-spark delta-lake

我想对 DeltaTable 执行删除操作,其中要删除的键已存在于 DataFrame 上。

目前我正在收集驱动程序上的DataFrame,然后运行删除操作。然而,这对我来说似乎效率很低。

(类似于下面的东西)

val keys = keysDF
            .select("key")
            .map(_.getLong(0))
            .collect()

DeltaTable.forPath(spark, "/path/to/table")
        .delete(col("key").isInCollection(keys))
Run Code Online (Sandbox Code Playgroud)

有没有更有效的方法来实现这一目标?我正在考虑以某种方式利用我的密钥已经分布在集群上的情况。

小智 7

是的 - Delta 有一个非常好的 api

val keys = keysDF
            .select("key")

val targetDeltaTable = DeltaTable.forPath(spark, path)

targetDeltaTable.alias("t")
      .merge(
        keys.alias("k"),
        "t.key = s.key")
      .whenMatched().delete()
      .execute()
Run Code Online (Sandbox Code Playgroud)