首页 > 解决方案 > 如何在写入 RDS posgtres 时使用 PySpark 的 JDBC 覆盖数据而不丢失架构?

问题描述

我正在使用下面的代码来实现上述功能:

   df.write \
            .format("jdbc") \
            .option("url","some_url") \
            .option("dbtable", "schema.table") \
            .option("user", "db_user_name") \
            .option("password", "pwd") \
            .option("truncate", "true") \
            .mode('append')\
            .save()

我有以下问题:

  1. truncate = true 是否仅适用于覆盖
  2. 为什么它不适用于附加?

有人可以为此提供一些解释!

标签: databasepostgresqlapache-sparkpysparkamazon-rds

解决方案


截断db您要附加到的表不起作用,因为您实际上是在尝试覆盖您的表。快速浏览https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html以查看option("truncate")节目:

启用 SaveMode.Overwrite 时,此选项会导致 Spark 截断现有表,而不是删除并重新创建它。这可以更有效,并防止表元数据(例如,索引)被删除。但是,它在某些情况下不起作用,例如当新数据具有不同的架构时。它默认为假。此选项仅适用于写作。

我假设您要实现的是您和目标表之间的模式验证。根据上面的选项描述,这应该已经是 options和的情况,即模式必须匹配。pyspark.sql.DataFramejdbctruncate=Truemode=overwrite

如果您尝试更改目标表的架构,则您的truncate选项应保持设置为Falsemode应设置为overwrite.

pyspark.sql.DataFrame或者,您可以通过将整个过程包装在 Python 函数中并从您的表和目标db表中提取模式,然后比较它们来编写自己的模式验证。


推荐阅读