Yas*_*ash 3 scala apache-spark apache-spark-sql udf apache-spark-2.0
我正在尝试创建一个Spark UDF来从用户定义的case类中提取(key,value)对的Map.
scala函数似乎工作正常,但是当我尝试将它转换为spark2.0中的UDF时,我遇到了"Schema for type Any is not supported"错误.
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
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将函数值实例化为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)
Run Code Online (Sandbox Code Playgroud)
错误消息说明了一切.你在地图上有一个Any.Spark SQL和Dataset api不支持架构中的Any.它必须是受支持的类型之一(它是一个基本类型的列表,如String,Integer等一系列受支持的类型或支持的类型的映射).
| 归档时间: |
|
| 查看次数: |
5215 次 |
| 最近记录: |