センサー測定値を保存するアプリケーションに取り組んでいます。場合によっては、センサーが誤った測定値を送信することがあります (たとえば、測定値が範囲外です)。各測定エラーを個別に保持したくはありませんが、センサー ID、最初のエラーの日付、最後のエラーの日付、および連続したエラーの数などのその他の情報など、これらのエラーに関する統計を保持したいと考えています。 、ここでは省略します...
「ErrorStatistic」クラスの簡易バージョンを次に示します。
package foo.bar.repository;
import org.joda.time.DateTime;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import static com.google.common.base.Preconditions.checkNotNull;
public class ErrorStatistic {
@Nonnull
private final String sensorId;
@Nonnull
private final DateTime startDate;
@Nullable
private DateTime endDate;
public ErrorStatistic(@Nonnull String sensorId, @Nonnull DateTime startDate) {
this.sensorId = checkNotNull(sensorId);
this.startDate = checkNotNull(startDate);
this.endDate = null;
}
@Nonnull
public String getSensorId() {
return sensorId;
}
@Nonnull
public DateTime getStartDate() {
return startDate;
}
@Nullable
public DateTime getEndDate() {
return endDate;
}
public void setEndDate(@Nonnull DateTime endDate) {
this.endDate = checkNotNull(endDate);
}
}
現在、次のように Hector を使用してこれらの ErrorStatistic を永続化しています。
private void persistErrorStatistic(ErrorStatistic errorStatistic) {
Mutator<String> mutator = HFactory.createMutator(keyspace, StringSerializer.get());
String rowKey = errorStatistic.getSensorId();
String columnName = errorStatistic.getStartDate().toString(YYYY_MM_DD_FORMATTER);
byte[] value = serialize(errorStatistic);
HColumn<String, byte[]> column = HFactory.createColumn(columnName, value, StringSerializer.get(), BytesArraySerializer.get());
mutator.addInsertion(rowKey, COLUMN_FAMILY, column);
mutator.execute();
}
private static final DateTimeFormatter YYYY_MM_DD_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd");
sensorId
エラーのある最初の測定値を受け取ると、startDate
設定された ErrorStatistic と null を作成しますendDate
。この ErrorStatistic はインメモリ モデルに保持され、Cassandra に永続化されます。次に、エラーのある次の測定のためにメモリ内の ErrorStatistic を更新します。有効な測定を受け取るまで、ErrorStatistic は保持され、メモリ内モデルから削除されます。
したがって、Cassandra には、制限のない間隔 ([2012-08-01T00:00Z|null] など) と閉じた間隔 ([2012-08-01T00:00Z|2013-01-12T10:23Z] など) の ErrorStatistics が含まれています。
これらの ErrorStatistics を日付で照会できるようにしたいと考えています。
たとえば、次の 3 つのエラー統計があるとします。
sensorId = foo
startDate = 2012-08-01T00:00Z
endDate = 2012-09-03T02:10Z
sensorId = foo
startDate = 2012-10-04T03:12Z
endDate = 2013-02-01T12:28Z
sensorId = foo
startDate = 2013-03-05T23:22Z
endDate = null
(this means we have not received a valid measurement since 2013-03-05)
日付で Cassandra にクエリを実行すると、次のようになります。
- 2012-08-04T10:00Z --> 最初の ErrorStatistic を返す必要があります
- 2012-09-04T00:00Z --> この時点でエラーはなかったことが返されるはずです
- 2014-01-03T00:00Z --> 最後の ErrorStatistic を返す必要があります (制限がないため)
これらの ErrorStatistic オブジェクトを効率的にクエリするために、これらのオブジェクトをどのように格納して「インデックス化」する必要があるのか わかりません。私は Cassandra にまったく慣れていないので、明らかな何かを見落としている可能性があります。
編集: 関心のあるクエリの種類に集中する必要があるという Joost の提案に応じて、以下が追加されました。
2 種類のクエリがあります。
- 1 つ目は、ご想像のとおり、特定のセンサーと時間範囲のすべての ErrorStatistics を一覧表示することです。これは比較的簡単に思えます。唯一の問題は、関心のある時間範囲の前にErrorStatistics が開始される場合です (たとえば、4 月のすべてのエラーをクエリし、クエリで ErrorStatistics[2012-03-29:2012- 04-02]も…)
- 2 番目のクエリは難しいようです。
startDate
特定のセンサーと日付について、間隔が特定の日付を含む、または特定の日付よりも前の ErrorStatistics を null で検索したいendDate
(これは、このセンサーのエラーがまだ受信されていることを意味します)。これを効率的に行う方法がわかりません。特定のセンサーのすべての ErrorStatistics をロードしてから、Java で間隔を確認することもできます...しかし、可能であればこれを避けたいと思います。私は、Cassandra が特定の日付で開始し、特定の日付よりも前の最初の ErrorStatistics (存在する場合) が見つかるまでさかのぼり、それをロードして、特定の日付以降であるかstartDate
どうかを Java でチェックするようにしたいと思います。しかし、それが可能かどうか、そしてそれがどれほど効率的かはわかりません。endDate
null