我正在使用下面的代码来实现上述功能:
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()
我有以下问题:
有人能给我解释一下吗?
发布于 2021-05-13 08:18:46
截断附加到的db
表不起作用,因为您实际上是试图覆盖表。快速浏览https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html的option("truncate")
显示:
当启用SaveMode.Overwrite时,此选项将导致Spark截断现有表,而不是删除和重新创建它。这可以提高效率,并防止删除表元数据(例如索引)。但是,在某些情况下,例如当新数据有不同的模式时,它将无法工作。默认为false。此选项仅适用于写作。
我假设您想要实现的是pyspark.sql.DataFrame
和目标值jdbc
表之间的模式验证。根据上面的选项描述,选项truncate=True
和mode=overwrite
的情况应该是这样的,即模式必须匹配。
如果试图更改目标表的架构,则truncate
选项应保持为False
,mode
应设置为overwrite
。
或者,您可以编写自己的模式验证,方法是将整个过程包装在Python函数中,并从pyspark.sql.DataFrame
和目标db
表中提取模式,然后比较它们。
https://stackoverflow.com/questions/67513874
复制相似问题