【问题标题】:Spark Scala SaveMode.Append - does it just append or also update?Spark Scala SaveMode.Append - 它只是追加还是更新?
【发布时间】:2021-04-21 08:02:01
【问题描述】:
如果我有一个 DF,并且我正在写信到这样的位置:
df.write.mode(SaveMode.Append).parquet(outputFilePath)
它只是简单地附加到outputFilePath 还是它也会更新?例如,如果我有一行3 | a | 27,并附加一个3 | a | 200 的DF,它会有两行吗?这是否意味着我每次都必须删除表并重新创建?
【问题讨论】:
标签:
scala
apache-spark
hdfs
【解决方案1】:
它只是简单地附加到outputFilePath 还是更新?
Append 只会将 DataFrame 的内容附加到该位置的现有数据中。
这是否意味着我每次都必须删除表并重新创建?
是的。但是您也可以查看Delta Lake,它使用 parquet 格式为 Spark 带来了 ACID 事务。
对于该用例,您可以使用 MERGE:
val updatesDF = // updates data
DeltaTable.forPath(spark, outputFilePath)
.as("destination")
.merge(updatesDF.as("updates"), "destination.Id = updates.Id")
.whenMatched
.updateExpr(Map("value" -> "updates.value"))
.whenNotMatched
.insertExpr(Map("id" -> "updates.id", "value" -> "updates.value"))
.execute()