scala - Spark - scala - 使用覆盖模式将数据帧保存到表中

标签 scala apache-spark

我想知道“覆盖”在这里到底做什么。假设我有一个表,表“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/

相关文章:

java - 将 scala.List[scala.Long] 转换为 List<java.util.Long>

scala - Scala 中是否可以同时具有隐式 Ordering[Option[T] 和 Ordered[Option[T]] ?

scala - 如何使用 ScalaTest 在 Playframework 单元测试中覆盖 guice 模块

scala - Spark 仅获取具有一个或多个空值的列

apache-spark - 结合 PyCharm、Spark 和 Jupyter

带有导入语句的 Scala 宏不起作用

apache-spark - 运行bin/pyspark时出现这个程序报错需要先build Spark

performance - Spark : Explicit caching can interfere with Catalyst optimizer's ability to optimize some queries?

python - 如何在 PySpark 中读取 Avro 文件

python - PySpark Dataframe 前向填充所有列