Pyspark DataFrame.write 到 SQL Server 不尊重 .option("truncate","true") 并覆盖现有表架构

问题描述 投票:0回答:1

我正在尝试将 Spark 数据帧写入现有的 SQL Server 表,以便在写入之前将其截断,并保留架构(特别是索引、约束和列类型)。我根据 documentation 的理解是,将

.mode("overwrite")
.option("truncate","true")
一起使用应该可以实现此目标。

但是,使用我的代码,该表将被删除并重新创建,而无需索引、约束和不同的数据类型(例如,使用文本而不是 nvarchar,而不是重新创建空列以允许空值)。我该如何编写它以尊重截断选项?

df.write \
  .format("jdbc") \
  .mode("overwrite") \
  .option("truncate","true") \
  .option("driver", "net.sourceforge.jtds.jdbc.Driver") \
  .option("url", url) \
  .option("dbtable", "target_table") \
  .option("user", USER) \
  .option("password", PASS) \
  .option("batchsize", 20000) \
  .option("createTableColumnTypes","col1 int not null,"
                                   "col2 varchar(50) not null,"
                                   "col2 varchar(50) not null,"
                                   "col3 date not null,") \
  .save()

我正在使用 Dataproc Serverless Spark 运行时 2.2,它使用 Spark 3.5.1

python sql-server apache-spark pyspark
1个回答
0
投票

我不确定您要插入的新数据的架构结构是否与现有数据不同,这可能会导致其被删除。

1.您可以尝试一些替代方法,例如首先手动截断它

truncate_query = "TRUNCATE TABLE target_table"
statement = connection.createStatement()

statement.executeUpdate(truncate_query)

2.然后使用

.mode("append")
,将数据插入到现有表中。

© www.soinside.com 2019 - 2024. All rights reserved.