2016-04-21 4 views
0

私はCassandraバージョン2.0を持っています。その中に全く新しいので、質問... 私はテーブルT1を持っています。名前は1,2,3 ... 14です。 Partitioning keyは、列12です。 Clustering keyは、3,1,5です。私は次のクエリを実行する必要があり :値を繰り返しているようどのようにクエリを動作させるには?

SELECT 1,2,7 FROM T1 where 2='A'; 

2は、フラグです。 は、私は次のエラーを取得する:

Unable to execute CQL query: Partitioning column 2 cannot be restricted because the preceding column 1 is either not restricted or is restricted by a non-EQ relation 

だから、それを行うための正しい方法は何ですか?私は本当にすでにフィルタリングされたデータを取得する必要があります。ありがとう。

答えて

1

だから、私はあなたのスキーマを理解していることを確認するには、テーブルT1を定義しています

CREATE TABLE T1 (
    1 INT, 
    2 INT, 
    3 INT, 
    ... 
    14 INT, 
    PRIMARY ((1, 2), 3, 1, 5) 
); 

は正しいですか?

このような場合は、その後、カサンドラはデータがあなたのCQLのクエリに答えるために見つけることができません。

SELECT 1,2,7 FROM T1 where 2 = 'A'; 

クエリは、カサンドラは計算できないことなく、コラム「1」の値を、提供していないため、パーティションキー(あなたのコンポジットPRIMARY KEYの定義では、 "1" "2"の両方の列を必要とします)がなければ、リング内のどのノードをどこで調べるかを決定できません。 パーティションキーに「2」を含めることで、そのデータがであることがCassandraに伝えられます。は、そのデータを格納する場所を決定します(したがって、となります)。あなたのスキーマ与え例えば

、このクエリはず作品:

SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A'; 

あなたはパーティション・キーの両方の値を提供しているため。

@Caleb Rockcliffeには、上記のテーブル定義が作業負荷の大きな部分を占めている場合は、他のセカンダリ/補足ルックアップメカニズムの必要性についてのアドバイスがあります。 に最初にの値を検索する場合は、の値を検索し、次にを入力してください。 など。: "1" の値を考えると

CREATE TABLE T1_index (
    1 INT, 
    2 INT, 
    PRIMARY KEY (1, 2); 
); 

、上記のあなたがして繰り返すことができ、それを通して可能 "2" の値、のすべて提供します:ために、その後、

SELECT 2 FROM T1_index WHERE 1 = 'X'; 

をとそれぞれ "1" と "2" の組み合わせ、することができますその後、問題表T1に対するクエリ:

SELECT 7 FROM T1 WHERE 1 = 'X' AND 2 = 'A'; 

これが役立つことを願っています!

+0

これは多くの助けになります、ありがとうございます。つまり、T1_indexではT1に挿入するたびに別々の挿入を行う必要があるということですか? –

+0

はい、残念ながら。カサンドラは「非正規化」を効果的に意味する「非正規化」が好きです。また、外部キーの制約やそのようなものをサポートしていないため、アプリケーションコードは(複数の)関連テーブルに書き込むことと、そこから読み込むことを知る必要があります。 – Castaglia

+0

私はちょうどこれを試して、私のスキーマでそれを試してみました、そして、あなたが示したものに基づいて私の仕事のための解決策を見つけたようです。したがって、特定の選択クエリごとに、別のテーブルを作成し、そのテーブルを自分のコードに挿入する必要があると言えます。これらの挿入が無視できるほど稀です。ですから、Cassandraは膨大な量の読み込みや、時折の挿入や更新に適しています。再び、私はそれと完全にRDBMSの男の新しいです)カサンドラの内部には、コードを複数回挿入するのではなく、すべてのテーブルを更新し続けるメカニズムがありますか? –

1

WHERE句には、パーティションキーの最初の要素を含める必要があります。

+0

はい、これはエラーと全く同じです。しかし、私が正しい方法で必要なものを手に入れるには? –

+2

データモデリングの柔軟性がなく、パーティション間を切断する必要がある場合は、インデックス作成戦略を検討することをお勧めします。 vanilla Cassandra 2.0では、おそらくセカンダリインデックスを使用することを意味しますが、そこには注意すべきいくつかの潜在的なパフォーマンス上の落とし穴があります。この問合せが読取りワークロードの大きな部分である場合は、制限しているキーが主キーの接頭部になるようにデータをモデリングすることを検討してください。 –

関連する問題