Схема для типа Any не поддерживается

Я пытаюсь создать искровую UDF для извлечения карты пар (ключ, значение) из определенного пользователем класса case.

Функция scala работает нормально, но когда я пытаюсь преобразовать ее в UDF в spark2.0, я сталкиваюсь с ошибкой «Схема для типа 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)

person Yash    schedule 08.02.2017    source источник


Ответы (1)


В сообщении об ошибке все сказано. У вас есть Any на карте. API Spark SQL и набора данных не поддерживает Any в схеме. Это должен быть один из поддерживаемых типов (который представляет собой список основных типов, таких как String, Integer и т. д., последовательность поддерживаемых типов или карта поддерживаемых типов).

person Assaf Mendelson    schedule 09.02.2017