不支持 Any 类型的架构
Schema for type Any is not supported
我正在尝试创建一个 spark UDF 以从用户定义的案例中提取(键,值)对的映射 class。
scala 函数似乎工作正常,但是当我尝试将其转换为 spark2.0 中的 UDF 时,我 运行 进入“不支持 Any 类型的模式”错误。
case class myType(c1: String, c2: Int)
def getCaseClassParams(cc: Product): Map[String, Any] = {
cc
.getClass
.getDeclaredFields // all field names
.map(_.getName)
.zip(cc.productIterator.to) // zipped with all values
.toMap
}
但是当我尝试将函数值实例化为 UDF 时,会导致以下错误 -
val ccUDF = udf{(cc: Product, i: String) => getCaseClassParams(cc).get(i)}
java.lang.UnsupportedOperationException: Schema for type Any is not supported
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:716)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:668)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:654)
at org.apache.spark.sql.functions$.udf(functions.scala:2841)
错误消息说明了一切。您在地图中有一个 Any。 Spark SQL 和 Dataset api 不支持架构中的 Any。它必须是受支持的类型之一(它是基本类型的列表,例如 String、Integer 等。受支持类型的序列或受支持类型的映射)。
我正在尝试创建一个 spark UDF 以从用户定义的案例中提取(键,值)对的映射 class。
scala 函数似乎工作正常,但是当我尝试将其转换为 spark2.0 中的 UDF 时,我 运行 进入“不支持 Any 类型的模式”错误。
case class myType(c1: String, c2: Int)
def getCaseClassParams(cc: Product): Map[String, Any] = {
cc
.getClass
.getDeclaredFields // all field names
.map(_.getName)
.zip(cc.productIterator.to) // zipped with all values
.toMap
}
但是当我尝试将函数值实例化为 UDF 时,会导致以下错误 -
val ccUDF = udf{(cc: Product, i: String) => getCaseClassParams(cc).get(i)}
java.lang.UnsupportedOperationException: Schema for type Any is not supported
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:716)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:668)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:654)
at org.apache.spark.sql.functions$.udf(functions.scala:2841)
错误消息说明了一切。您在地图中有一个 Any。 Spark SQL 和 Dataset api 不支持架构中的 Any。它必须是受支持的类型之一(它是基本类型的列表,例如 String、Integer 等。受支持类型的序列或受支持类型的映射)。