database - 如何在写入 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()
我有以下问题:
- truncate = true 是否仅适用于覆盖
- 为什么它不适用于附加?
有人可以为此提供一些解释!
解决方案
截断db
您要附加到的表不起作用,因为您实际上是在尝试覆盖您的表。快速浏览https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html以查看option("truncate")
节目:
启用 SaveMode.Overwrite 时,此选项会导致 Spark 截断现有表,而不是删除并重新创建它。这可以更有效,并防止表元数据(例如,索引)被删除。但是,它在某些情况下不起作用,例如当新数据具有不同的架构时。它默认为假。此选项仅适用于写作。
我假设您要实现的是您和目标表之间的模式验证。根据上面的选项描述,这应该已经是 options和的情况,即模式必须匹配。pyspark.sql.DataFrame
jdbc
truncate=True
mode=overwrite
如果您尝试更改目标表的架构,则您的truncate
选项应保持设置为False
并mode
应设置为overwrite
.
pyspark.sql.DataFrame
或者,您可以通过将整个过程包装在 Python 函数中并从您的表和目标db
表中提取模式,然后比较它们来编写自己的模式验证。
推荐阅读
- if-statement - 将公式转换为数组公式
- python - 无法使用 python 从 sftp 服务器下载文件
- excel - 如何将单元格值定义为工作表
- c# - C# 或 SQL 中的隔离级别 - 将使用哪一个?
- python - 文本 = sio.getvalue() ; 在“For”循环中返回“文本”无法识别
- angular - Angular @Optional 指令注入被忽略
- python - 检查列表的元素是否是同一列表中其他列表元素的子元素
- reactjs - 由于 Firebase 身份验证流程导致的循环依赖
- spring - Spring Boot REST 部署:我们需要 TomCat 吗?
- java - gitignore 文件不隐藏 github 的 .idea 目录