Apache spark JTS拓扑套件中的STRtree:批量加载数据和构建索引

Apache spark JTS拓扑套件中的STRtree:批量加载数据和构建索引,apache-spark,hdfs,r-tree,jts,Apache Spark,Hdfs,R Tree,Jts,现在我在文本文件中有一组数据(足够大),假设每一行代表一个矩形: x1,y1,x2,y2 读取文件后,如何使用大容量加载和构建R树索引 我检查了它的API,似乎只有insert可以在批量加载时使用 以下是我的测试代码: STRtree rtree = new STRtree(); rtree.insert(new Envelope(1.0,2.0,1.2,3.4),new Integer(1)); rtree.insert(new Envelope(4.0,3.2,1

现在我在文本文件中有一组数据(足够大),假设每一行代表一个矩形:

x1,y1,x2,y2
读取文件后,如何使用大容量加载和构建R树索引

我检查了它的API,似乎只有
insert
可以在批量加载时使用

以下是我的测试代码:

    STRtree rtree = new STRtree();

    rtree.insert(new Envelope(1.0,2.0,1.2,3.4),new Integer(1));
    rtree.insert(new Envelope(4.0,3.2,1.9,4.4),new Integer(2));
    rtree.insert(new Envelope(3.4,3.8,2.2,5.2),new Integer(3));
    rtree.insert(new Envelope(2.1,5.3,5.2,3.6),new Integer(4));
    rtree.insert(new Envelope(4.2,2.2,2.9,10.3),new Integer(5));

    List<Object> list = rtree.query(new Envelope(1.4,5.6,2.0,3.0));
我在
foreach
中调用了
insert
,当我打印
strtree
的大小时,它是零


为什么
foreach
中的
insert
方法不起作用?我遗漏了什么吗?

您正在正确地构建所有看起来像的东西,STRTree会在您查询之前进行批量加载,之后它不允许您添加或删除节点。如果您想将其与ApacheSpark并行,可以制作一个自定义分区器(类似于范围分区器),将您的区域划分为一个大网格,然后为每个分区运行一个STRTree。在spark(和标准java)中,您可以轻松地将STRTree保存到文件中,因为它实现了可序列化

的代码相当复杂,因为它对输入数据进行采样并创建范围的概率分区,如果您已经知道最大界限,那么可以通过基于所需的并行性生成网格来做一些更简单的事情(分区器基本上可以工作,通过找到几何体是网格的哪一部分并将所有几何体发送到该分区,分区器还可能使用STRTree来提高速度)


还有一个建议,为了简单起见,您可以使用spark中的标准RangePartitioner在x或y上对range进行分区,但是使用自定义的RangePartitioner可能会更好

,正如您所说,
STRTree在查询之前进行大容量加载。
。保存STRTree对象本身似乎没有意义,因为当我以后这样做时再次从文件进行序列化并调用查询,然后将再次执行批量加载工作。对吗?@ChenZhongPu我怀疑他们是否会以这种方式实现它,他们可能使用内部数据结构来存储它,并且只加载了它deserialization@ChenZhongPu你使用它的方式不起作用,理想情况下你应该创建如果我调用
inputData
collect()
,它可以工作。但是如果有一个大的数据集,这将导致它无法放入内存中。正如你所说,先执行
分区
会更好。
    val inputDataPath = "hdfs://localhost:9000/user/chenzhongpu/testData.dat"
    val conf = new SparkConf().setAppName("Range Query")

    // notice that: the function names for queries differ accoss systems.
    // here we simply refer intersect.

    val sc = new SparkContext(conf)

    val inputData = sc.textFile(inputDataPath).cache()

    val strtree = new STRtree

    inputData.foreach(line => {val array = line.split(",").map(_.toDouble); strtree.insert(new Envelope(array(0),array(1),array(2),array(3)),
      new Rectangle(array(0),array(1),array(2),array(3)))})