8

編集1:元の質問の後に問題を説明するケースを追加しました。

キーの一部ではない列についてクエリを実行したいと思います。正しく理解できれば、その列にセカンダリインデックスを定義する必要があります。ただし、(等式条件だけでなく)より大きい条件を使用したいのですが、それでもサポートされていないようです。

私は何かが足りないのですか?この問題にどのように対処しますか?

私の希望するセットアップ:

Cassandra 1.1.6
CQL3

CREATE TABLE Table1(
             KeyA int,
             KeyB int,
             ValueA int,
             PRIMARY KEY (KeyA, KeyB)
           );

CREATE INDEX ON Table1 (ValueA);

SELECT * FROM Table1 WHERE ValueA > 3000;

複合キーを使用してColumnFamiliesでセカンダリインデックスを定義することは、Cassandra 1.1.6ではまだサポートされていないため、キーの1つを削除する一時的な解決策を決定する必要がありますが、非等式条件でも同じ問題が発生します。

これに対処する別の方法はありますか?

お時間をいただきありがとうございます。

関連するソース: http ://cassandra.apache.org/doc/cql3/CQL.html#selectStmt http://www.datastax.com/docs/1.1/ddl/indexes


編集1

これが問題を説明するケースです。rs-atlが指摘したように、これはデータモデルの問題である可能性があります。すべてのユーザーの列ファミリーをstackoverflowに保持しているとしましょう。ユーザーごとに、統計のバッチを保持します(Reputation、NumOfAnswers、NumOfVotes ...すべてがintです)。これらの統計を照会して、関連するユーザーを取得したいと思います。

CREATE TABLE UserStats(
             UserID int,
             Reputation int,
             NumOfAnswers int,
             .
             .
             .
             A lot of stats...
             .
             .
             .
             NumOfVotes int,
             PRIMARY KEY (UserID)
           );

今、私はそれらの統計に基づいてUserIDをスライスすることに興味があります。レピュテーションが10Kを超えるすべてのユーザー、回答が5未満のすべてのユーザーなどが必要です。

それがお役に立てば幸いです。再度、感謝します。

4

3 に答える 3

1

おそらく、Cassandra でこのシナリオに対処する最も柔軟な方法は、次のように、キーとしてセンチネル値を使用し、列名に統計値を使用して、統計ごとに個別の CF を作成することです。

CF: StatName {
  Key: SomeSentinelValue {
    [Value]:[UserID] = ""
  }
}

統計が NumAnswers で、ユーザー ID が文字列であるとします。

CF: NumAnswers {
  Key: 0 {
    150:Joe = ""
    200:Bob = ""
    500:Sue = ""
  }
  Key: 1000 {
    1020:George = ""
    1300:Ringo = ""
    1300:Mary = ""
  }
}

したがって、キーは基本的に値のバケットであり、データの必要に応じて粗粒度または細粒度にすることができ、列は値 + ユーザー ID の複合体であることがわかります。Cassandra に、必要な大まかな範囲 (等値) の既知のキー (またはキーのセット) を渡してから、列名の最初のコンポーネントに対して範囲クエリを実行できます。ユーザー ID を値として書き込めないことに注意してください。これは、2 人のユーザーが同じカウントを持つことを防ぐためです。

于 2012-11-27T17:30:49.280 に答える