我正在尝试将 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
我不确定您要插入的新数据的架构结构是否与现有数据不同,这可能会导致其被删除。
1.您可以尝试一些替代方法,例如首先手动截断它
truncate_query = "TRUNCATE TABLE target_table"
statement = connection.createStatement()
statement.executeUpdate(truncate_query)
2.然后使用
.mode("append")
,将数据插入到现有表中。