Databricks - 写入 Azure Synapse 时出错

Posted

技术标签:

【中文标题】Databricks - 写入 Azure Synapse 时出错【英文标题】:Databricks - Error writing to Azure Synapse 【发布时间】:2021-07-16 04:32:08 【问题描述】:

我正在尝试使用以下代码将数据写入带有标识字段的 Azure Synapse 表

数据块上的代码

def get_jdbc_connection(host, sqlDatabase, user, password):
  jdbcHostname = ".database.windows.net".format(host)
  jdbc_url = "jdbc:sqlserver://:1433;database=;user=@;password=;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;".format(jdbcHostname, sqlDatabase, user, host, password)
  url = "jdbc:sqlserver://:1433;database=;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;".format(jdbcHostname, sqlDatabase)
  return (jdbc_url,url )

def write_adw(spark, df_target_adw, jdbc_url, table, tempDir, option_mode, pre_Actions ):
    df_target_adw.write.format("com.databricks.spark.sqldw") \
        .option("url", jdbc_url) \
        .option("useAzureMSI", "true") \
        .option("preActions", pre_Actions) \
        .option("dbTable", table) \
        .option("tempDir", tempDir) \
        .mode(option_mode) \
        .save()
    
dftraffic = spark.sql('SELECT distinct SourceName\
              ,1 AS IsActiveRow \
             ,"Pipe-123" as pipelineId \
              ,current_timestamp as ADFCreatedDateTime \
              ,current_timestamp as ADFModifiedDateTime \
              from deltaTable')

#write to ADW
(jdbc_url, url_adw) = get_jdbc_connection(host, sqlDatawarehouse,user, password)
target_table = 'TargetTable_name'
option_mode= "append"
pre_Actions= " SELECT GETDATE()"
write_adw(spark, dftraffic, jdbc_url, target_table, tempDir, option_mode, pre_Actions )

adw 上的目标表架构

Column Name Data Type
SourceSID INT IDENTITY (1,1) NOT NULL
Source Name VARCHAR(20) NOT NULL
IsRowActive BIT NOT NULL
PipelineId VARCHAR(20) NOT NULL
ADFCreatedDateTime DATETIME NOT NULL
ADFModifiedDateTime DATETIME NOT NULL

databricks 上的配置详情

Databricks 运行时 7.4(包括 Apache Spark 3.0.1、Scala 2.12)

错误信息

Py4JJavaError:调用 o457.save 时出错。 :com.databricks.spark.sqldw.SqlDWSideException:Azure Synapse Analytics 无法执行连接器生成的 JDBC 查询。 基础 SQLException(s): - com.microsoft.sqlserver.jdbc.SQLServerException: 表中标识列的显式值只能在使用列列表并且 IDENTITY_INSERT 为 ON 时指定

代码在 databricks 运行时 6.4 Spark 2.4.5 上运行良好,我在尝试升级 dbk 运行时时遇到了这个错误。 我怎样才能让它工作?

【问题讨论】:

您是否尝试将SET IDENTITY_INSERT archive_table ON; 添加为pre_Actions 让我试试,然后更新你。 @Idleguys 你有解决问题的办法吗? 不,这不起作用,因为我需要在插入完成后“关闭”桌子上的 identity_insert。 【参考方案1】:

你没有额外的行“1 AS IsActiveRow”吗?我在架构中没有看到

dftraffic = spark.sql('SELECT distinct SourceName\
              ,1 AS IsActiveRow \
             ,"Pipe-123" as pipelineId \
              ,current_timestamp as ADFCreatedDateTime \
              ,current_timestamp as ADFModifiedDateTime \
              from deltaTable)

【讨论】:

感谢您的回复。上述架构定义中有错字。道歉!我的目标表上有“IsActiveRow”字段。

以上是关于Databricks - 写入 Azure Synapse 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Azure Databricks - 将 Parquet 文件写入策划区域

无法从 databricks pyspark 工作人员写入 Azure Sql DataWarehouse

来自 Databricks Notebook 的 COSMOS DB 写入问题

Azure Databricks 将 JSON 数据写入 Parquet 文件引发错误:TypeError:无法推断类型的架构

如何使用 Azure databricks 通过 ADLS gen 2 中的多个工作表读取和写入 excel 数据

从 Azure Synapse 中的 Apache Spark 将数据写入 SQL DW