pyspark Spark到Synapse“截断”未按预期工作

gijlo24d  于 2022-12-11  发布在  Spark
关注(0)|答案(1)|浏览(128)

我有一个简单的要求,就是从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") \
3pvhb19x

3pvhb19x1#

我试着在我的环境中重现你的场景,但截断对我的突触连接器不起作用。
在研究此问题时,我发现并非所有选项都支持synapse连接器。在Microsoft官方文档中,提供了支持的选项列表,如dbTablequeryuserpasswordurlencrypt=truejdbcDrivertempDirtempCompressionforwardSparkAzureStorageCredentialsuseAzureMSIenableServicePrincipalAuth等等。
jdbc的nots synapse连接器支持Truncate ate选项。
当我将格式从com.databricks.spark.sqldw更改为jdbc时,它现在工作正常。

我的代码:

df.write.format("jdbc")
    .option("url",synapse_jdbc)
    .option("forwardSparkAzureStorageCredentials", "true")
    .option("dbTable", table_name)
    .option("tempDir", tempdir)
    .option("truncate","true")
    .mode("overwrite")
    .save()

首次执行:

第二次执行:

**结论:**对于执行代码的时间,表创建时间相同,意味着覆盖不是删除表,而是截断表

相关问题