不支持类型为Any的架构

时间:2017-02-08 19:10:14

标签: scala apache-spark apache-spark-sql udf apache-spark-2.0

我试图创建一个Spark UDF来从用户定义的案例类中提取(键,值)对的Map。

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)

1 个答案:

答案 0 :(得分:5)

错误消息说明了一切。你在地图上有一个Any。 Spark SQL和Dataset api不支持架构中的Any。它必须是受支持的类型之一(它是一个基本类型的列表,如String,Integer等一系列受支持的类型或支持类型的映射)。