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)))})