jdbc.SQLServerException:将数据导出到 Azure SQL Server 时找不到数据类型“TEXT”

Posted

技术标签:

【中文标题】jdbc.SQLServerException:将数据导出到 Azure SQL Server 时找不到数据类型“TEXT”【英文标题】:jdbc.SQLServerException: Cannot find data type 'TEXT' while exporting data to Azure SQL Server 【发布时间】:2017-05-26 10:53:13 【问题描述】:

我在 Azue HDInsight 上的 scala spark 2.1 中创建了一个数据框。我正在尝试使用 PostgreSQL 包将数据框写入 SQL 数据仓库。我尝试了以下命令来编写:

df1.write.format("jdbc").option("url", "jdbc:sqlserver://######").option("dbtable", "dbo.Period_ERROR").option("user", "dataiqdw").option("password", "######").save()

但我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Cannot find data type 'TEXT'.
  at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)

我能够从数据框中的 SQL 数据仓库中读取数据,但只有在我尝试将数据插入表时才会出现此错误。 我的问题和PySpark 2.0 export data to Azure SQL Server很相似

【问题讨论】:

很抱歉给您带来了困惑。我正在尝试连接到 SQL Server 实例,但它在 spark 2.1 中使用 Postgres 包。另外,我可以将整数列写入数据库,但是当我尝试使用字符串列时,我得到了上述错误。 可能是您的 SQL Server 版本中删除了对文本类型的支持。尝试在那里创建一个具有该列类型的表。 @Ankan - 我遇到了类似的问题。你能解决吗? 是的,将列类型更改为 varchar 或 String。将其从文本格式中删除将解决问题。 @Ankan,我也有同样的问题,当我删除字符串列时,问题就解决了,所以我的问题是你是如何将字符串类型转换为varchar的? 【参考方案1】:

尝试重写 getJDBCType() 方法并提供 STRING DataType 的实现,因为它默认采用 TEXT

override def getJDBCType(dt: DataType): Option[JdbcType] = 
    val answer = dt match 
      case TimestampType => Some(JdbcType("DATETIME", java.sql.Types.TIMESTAMP))
      case StringType => Some(JdbcType("VARCHAR(250)", java.sql.Types.VARCHAR))
      case _ => None
    

【讨论】:

以上是关于jdbc.SQLServerException:将数据导出到 Azure SQL Server 时找不到数据类型“TEXT”的主要内容,如果未能解决你的问题,请参考以下文章

com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据。

com.microsoft.sqlserver.jdbc.SQLServerexception:'=' 附近的语法不正确

Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 不支持“variant”数据类型。

com.microsoft.sqlserver.jdbc.SQLServerException:索引 8 超出范围

com.microsoft.sqlserver.jdbc.SQLServerException:用户“sa”登录失败[重复]

com.microsoft.sqlserver.jdbc.SQLServerException:连接超时(读取失败)