我想使用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); 显然这应该有效,但是至少对于火花它不会在相同的异常下起作用
解决方法:
使用类似https://github.com/plokhotnyuk/rtree2d之类的东西,它正确地支持序列化。尽管如此,如何将其改造为第一个示例还是很有趣的。