0

センサー測定値を保存するアプリケーションに取り組んでいます。場合によっては、センサーが誤った測定値を送信することがあります (たとえば、測定値が範囲外です)。各測定エラーを個別に保持したくはありませんが、センサー 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 でチェックするようにしたいと思います。しかし、それが可能かどうか、そしてそれがどれほど効率的かはわかりません。endDatenull
4

1 に答える 1