Apache spark 注册UDF时发生Spark错误:不支持AnyRef类型的架构
我正试图像这样向sqlContext注册一个UDF(在本地模式下运行spark) 这就是定义:Apache spark 注册UDF时发生Spark错误:不支持AnyRef类型的架构,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正试图像这样向sqlContext注册一个UDF(在本地模式下运行spark) 这就是定义: scala>def getStr=udf((s:String)=>{val lastS=s.substring(s.lastIndexOf('/')+1);lastS}) getStr:org.apache.spark.sql.UserDefinedFunction scala>sqlContext.udf.register(“getStr”,getStr) 这应该是一个函数的简单注册。 获取以下异
scala>def getStr=udf((s:String)=>{val lastS=s.substring(s.lastIndexOf('/')+1);lastS})
getStr:org.apache.spark.sql.UserDefinedFunction
scala>sqlContext.udf.register(“getStr”,getStr)
这应该是一个函数的简单注册。
获取以下异常:
java.lang.UnsupportedOperationException: Schema for type AnyRef is not supported
at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:718)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:693)
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:691)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.immutable.List.foreach(List.scala:318)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:691)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:630)
at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
at org.apache.spark.sql.UDFRegistration.register(UDFRegistration.scala:119)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:32)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:37)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:39)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:41)
at $iwC$$iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:43)
at $iwC$$iwC$$iwC$$iwC$$iwC.<init>(<console>:45)
at $iwC$$iwC$$iwC$$iwC.<init>(<console>:47)
at $iwC$$iwC$$iwC.<init>(<console>:49)
at $iwC$$iwC.<init>(<console>:51)
java.lang.UnsupportedOperationException:不支持AnyRef类型的架构
位于org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:718)
位于org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
位于org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:693)
位于org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:691)
位于scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
位于scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
位于scala.collection.immutable.List.foreach(List.scala:318)
位于scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
位于scala.collection.AbstractTraversable.map(Traversable.scala:105)
位于org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:691)
位于org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
位于org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:630)
位于org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:30)
在org.apache.spark.sql.UDFRegistration.register(UDFRegistration.scala:119)上
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:32)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:37)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:39)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:41)
在$iwC$$iwC$$iwC$$iwC$$iwC$$iwC。(:43)
在$iwC$$iwC$$iwC$$iwC$$iwC。(:45)
在$iwC$$iwC$$iwC$$iwC。(:47)
在$iwC$$iwC$$iwC。(:49)
$iwC$$iwC。(:51)
。。。等等
有什么帮助吗?UDF注册只有两种主要变体。register可用于标准(非聚合)UDF:
- 采用Scala闭包(
)的函数,其中Function[i]
从0到22i
- 一种采用
的方法,该方法是为Java互操作性而设计的,其中UDF[i]
从1变为22i
getStr
是UserDefinedFunction
,因此它与这两个函数都不匹配。为了能够正确地注册包装函数,您应该直接传递它:
sqlContext.udf.register("getStr", (s:String) => ...)
我没有导入org.apache.spark.sql.functions。现在问题解决了。你到底想用这个UDF做什么?我没有导入org.apache.spark.sql.functions_