Scala 未找到org.locationtech.jts.geom.Point的编码器

Scala 未找到org.locationtech.jts.geom.Point的编码器,scala,apache-spark,jts,geomesa,Scala,Apache Spark,Jts,Geomesa,在使用Geomesa和Scala时,我一直试图使用下面的代码片段对Spark数据帧中的2列进行编码,但我不断收到一个问题,Scala似乎无法将返回的对象序列化到数据帧中。使用Postgres和PostGIS时,生活很简单——这是一个简单的问题,还是有更好的库可以处理来自Spark数据框(包含纬度和经度的双格式)的地理空间查询 我在SBT中使用的版本有: 火花:2.3.0 斯卡拉:2.11.12 geomesa:2.2.1 jst-*:1.17.0-SNAPSHOT 线程“main”java.

在使用Geomesa和Scala时,我一直试图使用下面的代码片段对Spark数据帧中的2列进行编码,但我不断收到一个问题,Scala似乎无法将返回的对象序列化到数据帧中。使用Postgres和PostGIS时,生活很简单——这是一个简单的问题,还是有更好的库可以处理来自Spark数据框(包含纬度和经度的双格式)的地理空间查询

我在SBT中使用的版本有:

  • 火花:2.3.0
  • 斯卡拉:2.11.12
  • geomesa:2.2.1
  • jst-*:1.17.0-SNAPSHOT
线程“main”java.lang.UnsupportedOperationException中出现异常:未找到org.locationtech.jts.geom.Point的编码器

例外情况是:

    Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for org.locationtech.jts.geom.Point
- root class: "org.locationtech.jts.geom.Point"
  at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$org$apache$spark$sql$catalyst$ScalaReflection$$serializerFor$1.apply(ScalaReflection.scala:643)
  at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$org$apache$spark$sql$catalyst$ScalaReflection$$serializerFor$1.apply(ScalaReflection.scala:445)
  at scala.reflect.internal.tpe.TypeConstraints$UndoLog.undo(TypeConstraints.scala:56)
  at org.apache.spark.sql.catalyst.ScalaReflection$class.cleanUpReflectionObjects(ScalaReflection.scala:824)
  at org.apache.spark.sql.catalyst.ScalaReflection$.cleanUpReflectionObjects(ScalaReflection.scala:39)
  at org.apache.spark.sql.catalyst.ScalaReflection$.org$apache$spark$sql$catalyst$ScalaReflection$$serializerFor(ScalaReflection.scala:445)
  at org.apache.spark.sql.catalyst.ScalaReflection$.serializerFor(ScalaReflection.scala:434)
  at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$.apply(ExpressionEncoder.scala:71)
  at org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders$class.jtsPointEncoder(SpatialEncoders.scala:21)
  at org.locationtech.geomesa.spark.jts.package$.jtsPointEncoder(package.scala:17)
  at GetRandomData$.main(Main.scala:50)
  at GetRandomData.main(Main.scala)

简单地说,例外情况是:

我不知道如何将点转换为火花类型

如果将纬度和经度保持为数据集中的两倍,则应该可以,但一旦使用类似点的对象,则需要告诉Spark如何转换它。在Spark术语中,这些称为编码器,您可以创建自定义编码器


或者,只要您不介意丢失Spark SQL内容,就可以切换到不需要转换的RDD。

如果您不使用底层GeoMesa存储将数据加载到Spark会话中,则需要显式注册JTS类型:

org.apache.spark.sql.SQLTypes.init(spark.sqlContext)

这将注册
ST
操作以及JTS编码器。

您可以试用GeoMesa 2.1版real quick吗?现在可以了!:)。我一点也不在乎Spark SQL——我本应该打自己一顿,因为我不应该处理数据帧,而应该处理RDD。
org.apache.spark.sql.SQLTypes.init(spark.sqlContext)