2017-02-08 23 views
2

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

Функция scala работает нормально, но когда я пытаюсь преобразовать ее в UDF в spark2.0, я сталкиваюсь с ошибкой «Schema for type Any is not support».

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) 

ответ

2

сообщение об ошибке говорит все это. На карте есть символ Any. Spark SQL и Dataset api не поддерживают Any в схеме. Он должен быть одним из поддерживаемых типов (который представляет собой список основных типов, таких как String, Integer и т. Д., Последовательность поддерживаемых типов или карту поддерживаемых типов).

 Смежные вопросы

  • Нет связанных вопросов^_^