Dataframe VarcharType不匹配火花数据帧
我正在尝试更改数据帧的模式。每次我有一个字符串类型的列时,我都想将其类型更改为VarcharType(max),其中max是该列中字符串的最大长度。我编写了以下代码。(我想稍后将数据帧导出到sql server,我不想在sql server中使用nvarchar,所以我正在尝试将其限制在spark端) 然而,当运行它时,我得到了这个错误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
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(最大值)。我想你可以修改它。我会回答的。