我想知道“覆盖”在这里到底做什么。假设我有一个表,表“tb1”中包含以下记录(抱歉,表的表示不正确)
驾驶员 vin 型号
martin abc ford escape
john abd toyota camry
amy abe chevrolet malibu
carlos abf honda civic
现在我有以下数据框(mydf),具有相同的列,但具有以下行/数据
martin abf toyota corolla
carlos abg nissan versa
以覆盖模式将上述数据框保存到“tb1”后,该数据框是否会完全删除“tb1”的内容并写入mydf的数据(以上两条记录)?
但是,我希望覆盖模式仅覆盖那些“驱动程序”列具有相同值的行。在这种情况下,对于“tb1”中的 4 条记录,mydf 将仅覆盖以上 2 条记录,结果表如下 -
驾驶员 vin 型号
martin abf toyota corolla
john abd toyota camry
amy abe chevrolet malibu
carlos abg nissan versa
我可以使用覆盖模式实现此功能吗?
mydf.write.mode(SaveMode.Overwrite).saveAsTable("tb1")
最佳答案
您的意思是在主键上合并 2 个数据帧。您想要合并两个数据框并用新行替换旧行并附加额外的行(如果存在)。
这无法通过 SaveMode.Overwrite 或 SaveMode.append 来实现。
为此,您需要在主键上实现 2 个数据帧的合并功能。
类似这样的
parentDF = // actual dataframe
deltaDF = // new delta to be merged
val updateDF = spark.sql("select parentDF.* from parentDF join deltaDF on parentDF.id = deltaDF.id")
val totalDF = parentDF.except(updateDF).union(deltaDF)
totalDF.write.mode(SaveMode.Overwrite).saveAsTable("tb1")
关于scala - Spark - scala - 使用覆盖模式将数据帧保存到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474476/