2017-04-26 62 views
0

我正在使用名为Point(x:Double,y:Double)的数据类型。我试图用_c1列和_c2作为输入点(),然后创建点值的新列如下Spark 2.1.0不支持UDF架构类型

val toPoint = udf{(x: Double, y: Double) => Point(x,y)} 

然后我调用该函数:

val point = data.withColumn("Point", toPoint(watned("c1"),wanted("c2"))) 

然而,当我宣布UDF我得到以下错误:

java.lang.UnsupportedOperationException: Schema for type com.vividsolutions.jts.geom.Point is not supported 
     at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:733) 
     at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$2.apply(ScalaReflection.scala:729) 
     at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$2.apply(ScalaReflection.scala:728) 
     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 
     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 
     at scala.collection.immutable.List.foreach(List.scala:381) 
     at scala.collection.TraversableLike$class.map(TraversableLike.scala:234) 
     at scala.collection.immutable.List.map(List.scala:285) 
     at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:728) 
     at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:671) 
     at org.apache.spark.sql.functions$.udf(functions.scala:3084) 
     ... 48 elided 

我已经正确导入这些数据类型,并使用它之前很多次。现在我试图将它包含在我的udf的Schema中,但它不能识别它。什么是包括除标准Int,String,Array等以外的类型的方法...

我在Amazon EMR上使用Spark 2.1.0。

在这里,我引用了一些相关的问题:

How to define schema for custom type in Spark SQL?

Spark UDF error - Schema for type Any is not supported

+0

在你的例子中'wanted()'是什么? – himanshuIIITian

+0

@himanshulllTian对不起,这是数据库的列c1,c2,c3等 – user306603

+0

你有没有考虑过我的答案? –

回答

0

你应该定义Point作为案例类

case class Point(x: Double, y: Double) 

,或者如果你想

case class MyPoint(x:Double,y:Double) extends com.vividsolutions.jts.geom.Point(x,y) 

这种方式是由Spark自动推断的模式

+0

这样做我得到以下错误: 'case class myPoint has case ancestor geotrellis.vector.Point,但是禁止case-to-case继承。为了克服这个限制,使用提取器在非叶节点上模式匹配 – user306603

相关问题