1

次のように定義されたテーブルがある場合:

CREATE TABLE metrics (
  schedule_id int,
  time timestamp,
  value double,
  PRIMARY KEY (schedule_id, time)
);

単一のキーの最新のタイムスタンプと値を選択するのは簡単です。

SELECT time, value FROM metrics WHERE schedule_id = 1 ORDER BY time DESC LIMIT 1;

...しかし、すべての行の最新のタイムスタンプと値を効率的に選択するにはどうすればよいでしょうか?

通常の SQL または列範囲クエリのようなものGROUP BY schedule_id(CQL 3 ではサポートされなくなりました)。

4

1 に答える 1

0

Cassandra の結果整合性と最終書き込み優先のセマンティクスが原因で、ユース ケースがデータの差異を許容する方法がわからないため、これは単純なソリューションです。しかし、Cassandra でよくあることですが、データをさまざまなビュー (またはクエリの方法) をサポートする方法は、データを非正規化して複数の方法で保存することです。

CREATE TABLE latest_metrics (
    metric_name text,
    schedule_id int,
    latest_time timestamp,
    latest_value double,
    PRIMARY KEY (metric_name, schedule_id)
);

にデータを挿入するmetricsと、同時に にも書き込みlatest_metricsます (これは、リアルタイム フィードからのように、データが常に単調に増加する時間で入力されることを前提としています)。

INSERT INTO metrics (schedule_id, time, value) VALUES (?, ?, ?);
INSERT INTO latest_metrics (metric_name, schedule_id, latest_time, latest_value)
    VALUES ('WellKnownIdentifier', ?, ?, ?);

この場合、「最新」とは、実際のタイムスタンプフィールドの値ではなく、レコードが書き込まれた時期に関するものです。インターリーブされた時間を伴うデータを取り込む場合は、アプリケーション側でこれを処理する必要がある可能性があります。また、Cassandra 2.x で新しい新しい Compare-and-Set (CAS) 機能を使用することもできますが、そのために必要な Paxos プロセスは、書き込みパフォーマンスに深刻な影響を与えます。

INSERT INTO latest_metrics (...) VALUES (...) IF latest_time <= ?;

これらの仮定がすべてデータに当てはまる場合は、すべてのスケジュールの「最新」の値を簡単に照会できます。

SELECT schedule_id, latest_time, latest_value FROM latest_metrics WHERE metric_name = 'WellKnownIdentifier';
于 2014-04-26T19:03:01.287 に答える