如何处理来自天蓝色突触表的varchar中非空白列的空白以引发databricks

问题描述

当我从突触数据库中读取Spark中的表(使用天蓝色数据块)时,我遇到了问题。该表定义如下:

CREATE TABLE A
(
    [ID] [int] NOT NULL,[Value] [int] NOT NULL,[Description] [nvarchar](30) NOT NULL,)

字段Description可以为空白(即"")或可以包含空格。在突触中,我对此字段没有任何问题,当我用火花将表放入数据帧时也没有问题。当我写诸如df.show()df.count()之类的问题时,就会出现问题。出现以下错误

com.databricks.spark.sqldw.sqlDWSideException: Azure Synapse Analytics Failed to execute the JDBC query produced by the connector.

Py4JJavaError: An error occurred while calling o1779.showString.
: com.databricks.spark.sqldw.sqlDWSideException: Azure Synapse Analytics Failed to execute the JDBC query produced by the connector.

Underlying sqlException(s):
  - com.microsoft.sqlserver.jdbc.sqlServerException: Query aborted-- the maximum reject threshold (0 rows) was reached while reading from an external source: 1 rows rejected out of total 1 rows processed.
Column ordinal: 2,Expected data type: NVARCHAR(30) collate sql_latin1_General_CP1_CI_AS NOT NULL. [ErrorCode = 107090] [sqlState = S0001]

解决方法

免责声明:因为已经四个月了,我想您可能已经解决了这个问题或有一个解决方法。

我遇到了同样的问题,这是 Databricks 在从 Synapse 读取时如何处理空值与空字符串的错误。快速修复是将 Synapse 表设置为允许空值(即将 NOT NULL 更改为 NULL)。尽管空字符串在设置为 NOT NULL 的 Synapse 字段中 100% 有效,但出于某种原因,Databricks 正在从 Synapse 进行完整读取期间应用验证,这会破坏读取并导致失败。它知道 Synapse 模式,但没有正确理解和应用验证规则。由于 Spark 的懒惰执行,您只会在执行 show() 或 count() 时看到这一点。请注意,我正在向 Databricks 提交此错误。