azure - 将 PySpark Dataframe 写入 Azure Synapse 时面临的问题
问题描述
我在 Azure Databricks 中有一个 PySpark 数据框。我想写入 Azure Synapse。但我得到了错误。
com.microsoft.sqlserver.jdbc.SQLServerException: The statement failed. Column 'ETL_TableName' has a data type that cannot participate in a columnstore index.
我检查了 Synapse 的连接。一切正常,我能够读取数据。但是在写作时,我遇到了问题。任何人都可以帮助如何处理这个错误。
将数据写入 Synapse 的代码:
dataFrame.repartition(1).write.format("jdbc")\
.option("url", azureurl)\
.option("tempDir", tempDir) \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("dbTable", dbTable)\
.option("append", "true")\
.save()
解决方案
有几件事需要改变。
格式应该是.format("jdbc")
=> .format("com.databricks.spark.sqldw")
。
将此选项“tableOptions”子句添加到您的写入语句中。它取代了 CREATE TABLE (AS) 语句的 with() 子句:
.option ("tableOptions","heap,distribution=MY_DISTRIBUTION")
代码应如下所示:
dataFrame.repartition(1).write.format("com.databricks.spark.sqldw")\
.option("tableOptions","heap,distribution=HASH(rownum)")
.option("url", azureurl)\
.option("tempDir", tempDir) \
.option("forwardSparkAzureStorageCredentials", "true") \
.option("dbTable", dbTable)\
.option("append", "true")\
.save()
参考:
根据以下指导为 MY_DISTRIBUTION 选择一个值:
推荐阅读
- javascript - 您如何在 JavaScript 中比较两个正在使用的相似值并相应地分配它们?
- c - 从包装宏中调用 Malloc
- jquery - 读取jQuery中的每个表行
- ios - 归档时 xcode 9.3 错误命令 /bin/sh 失败,退出代码为 1
- php - php 脚本可以在 shell 中工作,但不能在网络服务器上工作
- ruby-on-rails - 设计:Net::SMTPSyntaxError: 501 发件人语法错误
- sqlite - 日期时间未针对 Xamarin MobileServiceClient PullAsync 进行格式化
- google-api - People API 的其他联系人
- javascript - 移除评级星函数 JS/PHP 的兄弟姐妹
- r - 使用 R 转换为 NetCDF 时保留栅格变量名称