2013-07-15 13 views
10

どのようにしてCQL3でコンポジット列の範囲をプルすることができますか?Cass3raワイド行をCQL3で反復する

以下を検討:カサンドラで

CREATE TABLE Stuff (
    a int, 
    b text, 
    c text, 
    d text, 
    PRIMARY KEY (a,b,c) 
); 

これは効果的に何される整数行とbとcの値と文字列リテラル「DからなるCompositeColumnsと(Aの値)とColumnFamilyを作成'もちろん、これはすべてCQL3で網羅されていますので、と考えていますが、個々のデータベースの行に挿入していますが、私は逸脱しています。

と入力次の一連の考慮:私の現在の使用例では

INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','P','whatever0'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','Q','whatever1'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','R','whatever2'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','S','whatever3'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'A','T','whatever4'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','P','whatever5'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','Q','whatever6'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','R','whatever7'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','S','whatever8'); 
INSERT INTO Stuff (a,b,c,d) VALUES (1,'B','T','whatever9'); 

を、私は一度スタッフ、n値の値のすべてを読むことをお勧めします。これはどうすればいいですか?ここでn=4を使用して私の現在のテイクがあります:

SELECT * FROM Stuff WHERE a=1 LIMIT 4; 

予想通り、私は得る:

a | b | c | d 
---+---+---+----------- 
1 | A | P | whatever0 
1 | A | Q | whatever1 
1 | A | R | whatever2 
1 | A | S | whatever3 

私はに実行するトラブルは、私は次の4を得るのですかですか?ここに私の試みは次のとおりです。

​​

私たちは同じ「A」にbを制約しましたので、これは動作しません - 行うには合理的なことです!しかし、私はCQL3の構文で何も見つからなかったので、とにかく反復処理を続けることができます。

SELECT * FROM Stuff WHERE a=1 AND {b,c} > {'A','S'} LIMIT 4; 

希望の結果を得るにはどうすればいいですか?

a | b | c | d 
---+---+---+----------- 
1 | A | T | whatever0 
1 | B | P | whatever1 
1 | B | Q | whatever2 
1 | B | R | whatever3 
+0

リリースです自己への注意:[同じ問題を抱えている他の人](http://stackoverflow.com/q/16951532/348056)。 – JnBrymn

答えて

5

自動ページングがhttps://issues.apache.org/jira/browse/CASSANDRA-4415に行われ、それはカサンドラ2.0.1に

+4

私の理解のために、私はcassnadra 2.0.6をインストールしてcqlshを使用していましたが、制限を与えずにCF(約20Kのレコードを持つ)に対してselectクエリを実行しようとしましたが、クエリの結果は10Kで、 "**デフォルトのLIMITは10000でしたより多くの結果を得るには、独自のLIMIT節を指定してください。** "" ..それでは、自動ページネーションはどこにありますか、何かが間違っている/理解しています。 – Shri

0

何をしようとすると、カサンドラにページネーションのものを得ることです。つまり、どのように私はCQL3リターンを作るのですか。 CQL3はこれをサポートしていません。 比較に適している列を作成する必要があります。つまり、より小さい演算よりも大きく、この列は増減シーケンスを構成する必要があります。確かに、上で気付いたjorgebgのように、b + cの連結はこれに適合します。

4

CQL3文書を読んだ後、私は希望の効果を達成する方法を見出していません。

ただし、一連のCQLクエリで目的の効果を偽装できます。上記のモデル4のアイテムを一度にページングしたいと考えてください。最初の4つを取得するのは簡単です。

SELECT * FROM a = 1 LIMIT 4;

ただし、1つのクエリで次の4つを取得する方法はありません。しかし私はそれを断片的に行うことができます。上記のクエリからの最後の項目は、だから私はここから始まり、bの次の値まですべてを取得するクエリを発行することができ

a | b | c | d 
---+---+---+----------- 
1 | A | S | whatever3 

です:

SELECT * B = '= 1 FROM 'とc>' S 'LIMIT 4;

そして、この場合には、私は、単一のCQL3行取得します:

a | b | c | d 
---+---+---+----------- 
1 | A | T | whatever4 

(私は4行を得たい場合は今、私は限界に当たると考え、私は最後に次回を開始すると。。その集合の要素しかし、今のところ、私はちょうど私がから反復残りの部分を取得するために、1行を持っている)だからポイントと残りの3行を取得:

SELECT * FROM a = 1 WHERE b > 'A' LIMIT 3; 

そして、私はこれと同じアルゴリズムを続けるを私が漸進的にスキャンして、私が望む限り。

上記の例では、PRIMARY KEYは3つの要素で構成されています。つまり、CassandraのCQLの場合、列名は2要素のCompositeColumnsです(基本的には違いますが、ここでは違いはありません)。また、CompositeColumnsは2つの要素で構成されているため、ここでデモしたように2つのクエリを作成する必要があります。ただし、PRIMARY KEYの要素がnの場合は、n-1クエリを作成してCQLテーブル(a.k.a Cassandra行)のスキャンを偽造する必要があります。


更新:確かに、CQL3は(「CQL3ページネーション」セクションhereを参照)、サーバー側カーソルを持っていない、とあなたはそれ偽したい場合、あなたは、上記のものを使用する必要があると思います(そのリンクをさらに読むので、私の基本的な考え方を投稿者の手によって詳しく説明します)。

ただし、Cassandra 2で利用可能で、既にCassandra 2 Betaに存在するサーバー側カーソルに関しては、JIRA issueがあります。

上記のように、クライアント側のカーソルを実装するのがはるかに簡単になる関連のJIRA issueもあります。しかしそれは未解決です。


更新2:JIRA issueが修正されました。

(C1、C2)>あなたは今、クエリタプル/ベクトル構文を使用することができます(1、0)

+0

LIMIT句の使用はお勧めしません。あなたの主キーを、代わりにメタテーブルの助けを借りて使用してください。 LIMITに達した時点を判断するための努力が必要なため、結果セットを返す前に誰かがすべての行を数えなければならないので、分散データベースの性質によるものと思われます。 – omnibear

-1

select * from stuff where a = 1 and (b,c) > ('A','S') limit 4;

+0

一般的に、答えには、コードの目的を説明し、他のコードを導入しないで問題を解決する理由が含まれていると、はるかに役立ちます。 (この投稿は、少なくとも1人のユーザーによってフラグが立てられました。おそらく、説明なしの回答を削除する必要があると考えたからです)。 –