2012-05-11 10 views
4

OrderPreservingPartitionerが使用され、行キーが厳密に昇順であると仮定すると、Cassandraクライアントを使用して最近追加された行の行キーを簡単に取得できますか?私は、すべての行をフェッチするためにget_range_slicesクエリを実行し、最後の行キーを見つけるために最後まで反復することができることを認識しています。しかし、それは時間がかかる操作であると感じています。Cassandraで追加された最後の行の行キーの取得方法

答えて

3

昇順になっていても、最後に挿入された行キーを取得することはできません。& OPPが使用されています。

  1. 最後に挿入されたキーをファイル またはそのような手段で保存することをお勧めします。 P
  2. キャッサンドラに執着したい場合は、元のCF(OCF)の挿入されたすべての行キーを一時CF(TCF)に列として保存することをお勧めします。あなたのTCFのcomparatorがあなたのkey_validation_class TCFの行の最後の列としてあなたOCFの最後に挿入row_keyを続けるだろう解決策2

OCFのと同じであることを確認してください。あなたは、最後から最初に取得するには、列にリバースレンジスライスを使用することができます;)

SELECT FIRST 1 REVERSED * from TCF where KEY='yourkey' 

をあなたがこの方法を、列の有効期限プロパティを使用してデータをモデル化Temporary_CFの行のサイズを制御することができますあなたのオプションを与えることができます最後にn個のrow_keysを挿入することもできます。

SELECT FIRST N REVERSED * from TCF where KEY='yourkey' 
1

使用パターン:私たちは頻繁に最後に追加された行

実装をロードする必要がありますシリアライズする前のrowKeyを「逆」。 OrderPreservingPartitionerを使用します。 RowKeyとして「タイムスタンプ」を使用します。

たとえば、RowKeyは長い番号(タイムスタンプを表します)です。その後、タイムスタンプのシリアル化には、リバーサル(Long.MAX_VALUE - タイムスタンプ)を使用します。最初の行が挿入された最後の行になります。

0

ノードのネットワーク全体のタイムスタンプの詳細の下の最後の行を絶対に知る必要がある場合は...私は何も考えることはできません。

しかし、cassandraは、most-recent-timestamp-winsで競合セル(行+列)の更新を解決するため、すべての挿入に対して、その表に対応する単一の行の単一の列も更新し、ALLでそのセルを照会します。 1つの行の更新をボトルネックにするのを防ぐために、columnfamily/tableごとに異なる行を使用することをお勧めします。

競合する同じタイムスタンプの更新が2つある場合は...おそらく、その時点で哲学的な質問にはまっているでしょう。あなたがネットワーク化されたシーケンスジェネレータのいくつかの減速点を望んでいない限り、それは嫌です。

一貫性をALLからQUORUMまたはONEに落とすと、結果がどれほど正確であるかに応じて、すばやく行を挿入できるようになります。

関連する問題