何百万もの場所をCassandraのColumnFamilyに保存してから、このデータに対して範囲クエリを実行したいと思います。
例えば:
属性:LocationName、緯度、経度クエリ:SELECT LocationName FROM ColumnFamily WHERE latitute>10AND緯度<20AND経度>30AND経度<40;
クエリが効率的になるように、どの構造とインデックスを使用する必要がありますか?
クエリで必要な粒度(およびその粒度の変動性)に応じて、これを処理する1つの方法は、マップをグリッドにスライスすることです。ここで、すべての場所は、定義された緯度/経度の境界を持つグリッド正方形内に属します。箱。次に、グリッドの正方形IDの最初のクエリを実行し、続いてそれらの正方形内の場所を次のような表現で実行できます。
GridSquareLat {
key: [very_coarse_lat_value] {
[square_lat_boundary]:[GridSquareIDList]
[square_lat_boundary]:[GridSquareIDList]
}
...
}
GridSquareLon {
key: [very_coarse_lon_value] {
[square_lon_boundary]:[GridSquareIDList]
[square_lon_boundary]:[GridSquareIDList]
}
...
}
Location {
key: [locationID] {
GridSquareID: [GridSquareID] <-- put a secondary index on this col
Lat: [exact_lat]
Lon: [exact_lon]
...
}
...
}
次に、Cassandraに非常に粗いグレインlat/lon値を表すGridSquareLat/Lonキーと、境界内のそれらの正方形にのみ返される列を減らす列スライス範囲を指定できます。2つのリストが表示されます。1つはlat用のグリッドスクエアIDで、もう1つはlon用です。これらのリストの交点は、範囲内のグリッドの正方形になります。
これらの正方形の位置を取得するには、位置CFをクエリし、GridSquareIDでフィルタリングします(グリッドの正方形の総数が妥当である限り効率的なセカンダリインデックスを使用します)。これで、非常に効率的なクエリがいくつかある、適度なサイズの場所のリストが作成され、アプリケーション内でそれらを正確なリストに簡単に減らすことができます。
あなたが数十億に成長しようとしているとしましょう(そして私は後で数百万のケースを行います)。cassandraでPlayOrmのようなものを使用していた場合(またはPlayOrmを使用する代わりに自分でこれを行うことができます)、何かでパーティション化する必要があります。経度でパーティション化することを選択したとします。これにより、> = 20〜 <30の間はパーティション20に、> = 30〜 <40はパーティション30になります。次に、PlayOrmでは、スケーラブルSQLを使用して同じクエリを記述します。作成しましたが、結果セットのサイズを制限しない限り、場合によっては複数のパーティションになる適切なパーティションをクエリする必要があります...
PlayOrmまたはデータモデルでは、次のようになります(他のテーブルは必要ありません)
Location {
key: [locationID] {
LonBottom: [partitionKey]
Lat: [exact_lat] <- @NoSqlIndexed
Lon: [exact_lon] <- @NoSqlIndexed
...
}
...
}
とはいえ、数百万の場合はパーティションは必要ないので、上のLonBottom列を削除して、パーティション化を行わないでください。もちろん、数百万はそれほど大きくなく、RDBMSは数百万を簡単に処理できるため、noSQLを使用するのはなぜですか。
自分でやりたい場合は、数百万の場合、latとlongのインデックス値を保持するLatとLon(幅の広い行パターン)の2つの行があります。ビリノスの場合、インデックスが大きすぎないようにするため、各パーティションが独自のインデックスを取得するため、パーティションごとに2行になります。
インデックス行は簡単に作成できます。これは単にrowkey="index name"であり、各列名は経度と場所の行キーの複合名です。各列に値はなく、複合名のみです(したがって、各列名は一意です)。
だからあなたの行は次のように見えるかもしれません
longindex = 32.rowkey1, 32.rowkey45, 32.rowkey56, 33.rowkey87, 33.rowkey89
ここで、32と33は経度であり、行キーは場所を指しています。