我有一个简单的要求,就是从spark(databricks)向一个synapse专用池表写入一个 Dataframe ,并且每天刷新(截断)它而不丢弃它。
Documentation建议在overwrite
模式下使用truncate
,但似乎没有按预期工作。
我正在使用
df.write \
.format("com.databricks.spark.sqldw") \
.option("url", synapse_jdbc) \
.option("tempDir", tempDir) \
.option("useAzureMSI", "true") \
.option("dbTable", table_name) \
.mode("overwrite") \
.option("truncate","true") \
.save()
但是我是否使用truncate
似乎没有任何区别。每次我从数据库执行上述操作时,synapse中表的创建日期/时间都会更新。有人能帮助我吗?我错过了什么?
我已经有了一个可行的变通办法,但看起来更像是一个变通办法
.option("preActions", "truncate table "+table_name) \
.mode("append") \
1条答案
按热度按时间3pvhb19x1#
我试着在我的环境中重现你的场景,但截断对我的突触连接器不起作用。
在研究此问题时,我发现并非所有选项都支持synapse连接器。在Microsoft官方文档中,提供了支持的选项列表,如
dbTable
、query
、user
、password
、url
、encrypt=true
、jdbcDriver
、tempDir
、tempCompression
、forwardSparkAzureStorageCredentials
、useAzureMSI
enableServicePrincipalAuth
等等。jdbc
的nots synapse连接器支持Truncate ate选项。当我将格式从
com.databricks.spark.sqldw
更改为jdbc
时,它现在工作正常。我的代码:
首次执行:
第二次执行:
**结论:**对于执行代码的时间,表创建时间相同,意味着覆盖不是删除表,而是截断表