我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)

Posted

技术标签:

【中文标题】我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)【英文标题】:I can't create-load data from spark dataframe in databricks to Azure Synapse (DWH) 【发布时间】:2021-02-16 16:45:28 【问题描述】:

我是这个领域的新手,目前正在使用 Azure 和 Databricks。我将一个 Json 文件从 blob 提取到数据块,进行了一些转换,现在希望将其加载到 Azure 中的原始 DWH(突触)。

代码执行在 .mode("overwrite") 处显示错误并给出以下错误:com.databricks.spark.sqldw.SqlDWSideException: Azure Synapse Analytics 未能执行连接器生成的 JDBC 查询。

单元格包含以下代码:

dwTable= "mytable001"
dwDatabase = "*****"
dwServer = "****.database.windows.net" 
dwUser = "****"
dwPass = "****"
dwJdbcPort =  "1433"
dwJdbcExtraOptions = "encrypt=true;trustServerCertificate=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
sqlDwUrl = "jdbc:sqlserver://" + dwServer + ".database.windows.net:" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass + ";$dwJdbcExtraOptions"
sqlDwUrlSmall = "jdbc:sqlserver://" + dwServer + ".database.windows.net:" + dwJdbcPort + ";database=" + dwDatabase + ";user=" + dwUser+";password=" + dwPass


tempDir = "wasbs://****@*****.blob.core.windows.net/tempDirs"

acntInfo = "fs.azure.account.key.databrickstrainingst.blob.core.windows.net"
sc._jsc.hadoopConfiguration().set(
  acntInfo, 
  "key****")

spark.conf.set("spark.sql.parquet.writeLegacyFormat","true")

renamedColumnsDF.write \
  .format("com.databricks.spark.sqldw") \
  .option("url", sqlDwUrlSmall) \
  .option("dbtable", dwTable) \
  .option( "forward_spark_azure_storage_credentials","true") \
  .option("tempdir", tempDir) \
  .mode("overwrite") \
  .save()

【问题讨论】:

您能否分享您遇到的错误消息的完整堆栈跟踪?同时,您可以查看此线程:docs.microsoft.com/en-us/answers/questions/118393/… 如果您有机会看到之前的回复,请检查一下。我们需要以下信息来进一步了解/调查此问题。 【参考方案1】:

如果encrypt property is set to truetrustServerCertificate property is set to false 且连接字符串中的服务器名称与TLS 证书中的服务器名称不匹配,则会出现以下错误。从 7.2 版本开始,驱动程序支持在 TLS 证书中服务器名称的最左侧标签中进行通配符模式匹配。

("url", "jdbc:sqlserver://cheprasynapse.sql.azuresynapse.net:1433;database=chepra;user=Your_username;password=Your_Password;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;")

encrypt property is set to truetrustServerCertificate property is set to true, 时,Microsoft JDBC Driver for SQL Server 不会验证 SQL Server TLS 证书。这通常是在测试环境中允许连接所必需的,例如 SQL Server 实例只有一个自签名证书的情况。

("url", "jdbc:sqlserver://cheprasynapse.sql.azuresynapse.net:1433;database=chepra;user=Your_username;password=Your_Password;encrypt=true;trustServerCertificate=true;hostNameInCertificate=*.sql.azuresynapse.net;loginTimeout=30;")

更多详情,请参考Connecting with encryption。

【讨论】:

如果对你有用,可以accept it as an answer吗?它可能会帮助更多有类似问题的人。

以上是关于我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)的主要内容,如果未能解决你的问题,请参考以下文章

将大型 Spark 数据帧从数据块写入 csv 失败

从数据块中的另一个笔记本返回数据帧

如何使用 Spark 数据帧将 csv 数据加载到配置单元中?

如何加快 Spark 中的大数据框连接

从来自 java 中 InputStream 的字符串创建 Spark RDD 或数据帧

通过在spark中使用scala加载csv文件来创建数据帧