3

これで、テキスト ファイル (十分な大きさ) にデータのセットができました。各行が四角形を表しているとします。

x1,y1,x2,y2

ファイルを読み取った後、 http: //www.vividsolutions.com/jts/javadoc/index.html を使用して 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));

R ツリー インデックスを作成する正しい方法insertですか (メソッドを使用するだけです)。

もう 1 つの質問は、入力ファイルが十分に大きく、たとえば、GB または TB スケールでHDFSApache Spark.

最後に、R ツリーをファイルに保存して保存し、後で使用するために回復するというアイデアはありますか?

編集:ファイル を読み取っHDFSてインデックスを作成しました。ここに私のコードがあります:

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

を呼び出しinsertforeach、 のサイズを印刷するとstrtree、 はゼロです!

insert内部のメソッドがforeach機能しないのはなぜですか? 私は何か見落としてますか?

4

1 に答える 1

0

STRTree は、クエリを実行するまでバルク ロードを実行し、その後はノードを追加または削除できません。これを Apache Spark で並列化する場合は、領域を大きなグリッドに分割するカスタム パーティショナー (レンジ パーティショナーと同様) を作成し、各パーティションに対して STRTree を実行できます。spark (および標準 Java) では、STRTree はシリアライズ可能であるため、ファイルに簡単に保存できます。

RangePartionerのコードは、入力データをサンプリングし、範囲の確率的パーティショニングを作成するため、非常に複雑です。最大境界が既にわかっている場合は、必要な並列処理に基づいてグリッドを作成することで、より簡単なことを行うことができます (パーティショナーは基本的に機能しますが、ジオメトリがグリッドのどの部分であるかを検出し、すべてのジオメトリをそのパーティションに送信することで、パーティショナーは速度のために STRTree を使用する可能性もあります)

もう 1 つの提案として、簡単にするために、spark で標準の RangePartitioner を使用して x または y のみの範囲でパーティション分割できますが、カスタムのものを使用した方がうまくいく可能性があります。

于 2015-03-18T15:22:47.000 に答える