Dataframe VarcharType不匹配火花数据帧

Dataframe VarcharType不匹配火花数据帧,dataframe,apache-spark,varchar,Dataframe,Apache Spark,Varchar,我正在尝试更改数据帧的模式。每次我有一个字符串类型的列时,我都想将其类型更改为VarcharType(max),其中max是该列中字符串的最大长度。我编写了以下代码。(我想稍后将数据帧导出到sql server,我不想在sql server中使用nvarchar,所以我正在尝试将其限制在spark端) 然而,当运行它时,我得到了这个错误 20/01/22 15:29:44 ERROR ApplicationMaster: User class threw exception: scala.M

我正在尝试更改数据帧的模式。每次我有一个字符串类型的列时,我都想将其类型更改为VarcharType(max),其中max是该列中字符串的最大长度。我编写了以下代码。(我想稍后将数据帧导出到sql server,我不想在sql server中使用nvarchar,所以我正在尝试将其限制在spark端)

然而,当运行它时,我得到了这个错误

  20/01/22 15:29:44 ERROR ApplicationMaster: User class threw exception: scala.MatchError: 
  VarcharType(9) (of class org.apache.spark.sql.types.VarcharType)
  scala.MatchError: VarcharType(9) (of class org.apache.spark.sql.types.VarcharType)

数据帧列是否可以是VarcharType(n)类型?

从数据库到/从数据帧的数据映射发生在方言类中。对于MS SQL server,类是
org.apache.spark.SQL.jdbc.mssqlserverdial
。您可以从中继承并重写
getJDBCType
,以影响从数据帧到表的数据类型映射。然后注册您的方言,使其生效

我已经为Oracle(不是sqlserver)完成了这项工作,但是也可以类似地完成

//Change this
  override def getJDBCType(dt: DataType): Option[JdbcType] = dt match {
    case TimestampType => Some(JdbcType("DATETIME", java.sql.Types.TIMESTAMP))
    case StringType => Some(JdbcType("NVARCHAR(MAX)", java.sql.Types.NVARCHAR))
    case BooleanType => Some(JdbcType("BIT", java.sql.Types.BIT))
    case _ => None
  }

您不能使用VarcharType,因为它不是
数据类型
。此外,您不能检查实际数据的长度,因为它并没有公开。您只能访问“dt:DataType”,因此如果max不可接受,您可以为NVARCHAR设置默认大小。

从数据库到/从数据帧的数据映射发生在方言类中。对于MS SQL server,类是
org.apache.spark.SQL.jdbc.mssqlserverdial
。您可以从中继承并重写
getJDBCType
,以影响从数据帧到表的数据类型映射。然后注册您的方言,使其生效

我已经为Oracle(不是sqlserver)完成了这项工作,但是也可以类似地完成

//Change this
  override def getJDBCType(dt: DataType): Option[JdbcType] = dt match {
    case TimestampType => Some(JdbcType("DATETIME", java.sql.Types.TIMESTAMP))
    case StringType => Some(JdbcType("NVARCHAR(MAX)", java.sql.Types.NVARCHAR))
    case BooleanType => Some(JdbcType("BIT", java.sql.Types.BIT))
    case _ => None
  }

您不能使用VarcharType,因为它不是
数据类型
。此外,您不能检查实际数据的长度,因为它并没有公开。您只能访问“dt:DataType”,因此如果max不可接受,您可以为NVARCHAR设置默认大小。

是否可以使用StringType,它将映射到SQLServer上的varchar列?问题是我想限制字符串长度。我可以用StringType实现吗?StringType映射到NVARCHAR(最大值)。我想你可以修改它。我会回答。你能使用StringType吗?它会映射到SQLServer上的varchar列。问题是我想限制字符串长度。我可以用StringType实现吗?StringType映射到NVARCHAR(最大值)。我想你可以修改它。我会回答的。