繁体   English   中英

将 spark dataframe 从 Databricks 写入 Azure Synapse 时出错

[英]Error when write spark dataframe from Databricks into Azure Synapse

我正在尝试将 spark dataframe 写入 Azure Syanpse 数据库。

我的代码:

try:
  re_spdf.write \
    .format("com.microsoft.sqlserver.jdbc.spark") \
    .mode("append") \
    .option("url", url) \
    .option("dbtable", table_name) \
    .option("user", username) \
    .option("password", password) \
    .option("encrypt", 'True') \
    .option("trustServerCertificate", 'false') \
    .option("hostNameInCertificate", '*.database.windows.net') \
    .option("mssqlIsolationLevel", "READ_UNCOMMITTED") \
    .option('driver', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')\
    .save()
except ValueError as error :
    print("Connector write failed", error)

错误信息:

org.apache.spark.SparkException: Job aborted due to stage failure: 
Task 1 in stage 29.0 failed 4 times, most recent failure: 
Lost task 1.3 in stage 29.0 (TID 885, 10.139.64.8, executor 0):
com.microsoft.sqlserver.jdbc.SQLServerException:
PdwManagedToNativeInteropException ErrorNumber: 46724, MajorCode: 467, 
MinorCode: 24, Severity: 20, State: 2, Exception of type 
'Microsoft.SqlServer.DataWarehouse.Tds.PdwManagedToNativeInteropException' was thrown.

甚至我用谷歌搜索了这个错误信息。 我没有得到任何有用的解决方案。

更新:我的工作环境是Databricks pyspark笔记本。

任何建议,将不胜感激。

突触数据库表中有一些列长度限制。 它将只允许 4000 个字符。

所以当我使用com.databricks.spark.sqldw因为它使用Polybase作为连接器时,我还需要更改数据库表中列的长度。 参考: https://forums.databricks.com/questions/21032/databricks-throwing-error-sql-dw-failed-to-execute.html

代码:

df.write \
  .format("com.databricks.spark.sqldw") \
  .mode("append") \
  .option("url", url) \
  .option("user", username) \
  .option("password", password) \
  .option("maxStrLength", "4000" ) \
  .option("tempDir", "tempdirdetails") \
  .option("forwardSparkAzureStorageCredentials", "true") \
  .option("mssqlIsolationLevel", "READ_UNCOMMITTED") \
  .option("dbTable", table_name) \
  .save()

Azure databricks 文档说格式com.databricks.spark.sqldw从 Azure Synapse 表读取/写入数据。

如果您使用的是 Synapse,为什么不使用 Synapse 笔记本然后编写 dataframe 就像调用synapsesql一样简单,例如

%%spark
df.write.synapsesql("yourPool.dbo.someXMLTable_processed", Constants.INTERNAL)

你会为自己省去一些麻烦,而且性能应该很好,因为它是并行的。 这是主要文章:

https://learn.microsoft.com/en-us/azure/synapse-analytics/spark/synapse-spark-sql-pool-import-export

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM