3

我在 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()
4

2 回答 2

1

有几件事需要改变。

格式应该是.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()

参考:

Azure Databricks - Azure 突触分析

根据以下指导为 MY_DISTRIBUTION 选择一个值:

在 Synapse SQL 池中设计分布式表的指南

于 2020-07-03T09:00:36.953 回答
0

这不是上述问题的确切答案。但它可能会帮助某人克服。“我仍然不知道上述问题背后的原因”。但我注意到在尝试写入 Azure Synapse Warehouse 时会出现此问题。由于我没有任何严格的理由坚持使用 Synapse Warehouse,并且整个优先事项是以结构化格式将 Databricks 中的数据写入 Azure,因此我将 Azure Synapse 仓库替换为 Azure SQL Server 数据库。它的工作效果要好得多。将更新答案一旦我找到问题背后的实际原因。

于 2020-07-06T13:56:08.127 回答