spark广播变量不可序列化异常

时间:2019-08-14 16:00:36

标签: java apache-spark apache-spark-sql notserializableexception

我想使用https://github.com/davidmoten/rtree2之类的Rtree作为火花广播变量。

但是,java.io.NotSerializableException: com.github.davidmoten.rtree2.RTree不支持。

有解决方法吗? https://github.com/davidmoten/rtree2建议:

/ deserialize the entries from disk (for example)
List<Entry<Thing, Point> entries = ...
// bulk load
RTree<Thing, Point> tree = RTree.maxChildren(28).star().create(entries); 

但是我不知道如何在广播变量的上下文中适应它。即我当然可以广播条目列表,但是在使用UDF时,我不知道在初始化Rtree然后在所有执行程序上初始化的入口点。 当然,应该可以通过map-partitions进行操作,但是到目前为止,我更喜欢使用UDF方法。

import com.github.davidmoten.grumpy.core.Position
  import com.github.davidmoten.rtree2.geometry.{Geometries, Point}
  import com.github.davidmoten.rtree2.{Entry, Iterables, RTree}

  val sydney = Geometries.point(151.2094, -33.86)
  val canberra = Geometries.point(149.1244, -35.3075)
  val brisbane = Geometries.point(153.0278, -27.4679)
  val bungendore = Geometries.point(149.4500, -35.2500)

  var tree = RTree.star.create[String, Point]
  tree = tree.add("Sydney", sydney)
  tree = tree.add("Brisbane", brisbane)

  val broadcastVar = spark.sparkContext.broadcast(tree)

由于上述异常而失败。

通过这种方式也适用于

  • https://github.com/davidmoten/rtree

    RTree树= ...; OutputStream os = ...; 序列化器序列化器=   Serializers.flatBuffers()。utf8(); serializer.write(tree,os); 显然这应该有效,但是至少对于火花它不会在相同的异常下起作用

编辑2

解决方法:

使用类似https://github.com/plokhotnyuk/rtree2d之类的东西,它正确地支持序列化。尽管如此,如何将其改造为第一个示例还是很有趣的。

0 个答案:

没有答案