问题描述
我想在DeltaTable上执行删除操作,其中要删除的键已经存在于DataFrame中。
当前,我正在收集驱动程序上的DataFrame,然后运行删除操作。但是对我来说,这似乎效率很低。
(如下所示)
val keys = keysDF
.select("key")
.map(_.getLong(0))
.collect()
DeltaTable.forPath(spark,"/path/to/table")
.delete(col("key").isInCollection(keys))
有没有更有效的方法来实现这一目标?我在想以某种方式利用我的密钥已经分布在整个集群中。
解决方法
是的-在数据湖中有一个非常好的api
val键= keysDF .select(“ key”)
val targetDeltaTable = DeltaTable.forPath(火花,路径)
targetDeltaTable.alias(“ t”) 。合并( keys.alias(“ k”), “ t.key = s.key”) .whenMatched()。delete() .execute()