2017-06-03 3 views
0

これは私がテーブルを作成するために使用されるクエリは次のとおりです。Cassandra CQLを使用してこのテーブルの最後の50行を取得するにはどうすればよいですか?

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (msguuid)); 

は私が降順にタイムスタンプでソートされた最後の50行を取得したいです。私のような何かしようとした場合

:私は、クエリは可能な限り迅速になりたい、私はフィルタリングを許可し使用することを希望されない

Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING" 

SELECT * FROM test.comments WHERE page = 'test' AND timestamp < 1496468332を、私はこのエラーを取得します。

私はここに別のstackoverflow質問Cassandra cql: how to select the LAST n rows from a tableを見て、解決策を試してみた:

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (msguuid)) WITH CLUSTERING ORDER BY (msguuid DESC); 

しかし、その後、私はこのエラーを取得する:InvalidRequest: Error from server: code=2200 [Invalid query] message="Only clustering key columns can be defined in CLUSTERING ORDER directive"

私はカサンドラに新たなんだので、この場合は私を許して明らかな答えがある。私はちょうどそれを働かせるように見えない。

誰でも私を助けることができたら大変感謝します。代わりに、インデックスを使用しての

+0

ページはインデックスフィールドですか? –

+0

はい、ページはインデックスに登録されています –

+0

どのcassandraバージョンを使用していますか? –

答えて

1

は、パーティション・キーとDESCでキーの順序をクラスタリングなどmsguuidとしてページを持つマテリアライズド・ビューを作成しますMaterialized View

を作成します。

CREATE MATERIALIZED VIEW test.comments_by_page AS 
    SELECT * 
    FROM test.comments 
    WHERE page IS NOT NULL AND msguuid IS NOT NULL 
    PRIMARY KEY (page, msguuid) 
    WITH CLUSTERING ORDER BY (msguuid DESC); 

あなたは現在のタイムスタンプのtimeuuidとしてmsguuidを使用していますが、あなたのデータは、時間の降順で並べ替えられます。

SELECT * FROM comments_by_page WHERE page = 'test' LIMIT 50; 

インデックスを超えるマテリアライズド・ビューのパフォーマンスを知るためにチェックし、このリンクと使用しない:カサンドラの世界ではhttp://www.datastax.com/dev/blog/materialized-view-performance-in-cassandra-3-x

+1

これは完全に機能します。どうもありがとう! –

1

以下のクエリを使用したページの最後の50行を取得するには

満足するために必要なクエリに基づいてテーブルをモデル化してみてください。クエリは常にwhere句「ページ」で行くと

CREATE TABLE test.comments (msguuid timeuuid, page text, userid text, username text, msg text, timestamp int, PRIMARY KEY (page, msguuid), WITH CLUSTERING ORDER BY (msguuid DESC)); 

今の表では、自然にmsguuidによって順序で、持っているどのような要件がないを次のようにmsguuidは一意再設計のためだけそこのようなものにテーブルの場合マテリアライズド・ビューの追加オーバーヘッド。

+1

ありがとう、私はオーバーヘッドなしでそれを行う方法があることをうれしく思っています。私は代わりに答えとしてあなたの印をつけました。 –

+0

@dilsingi私の解決策は、墓石を生成しません。 MVは、基本テーブルでMVの主キー 'page'と' msguuid'が更新された場合にのみ、墓石を生成します。彼の主な理由で 'page'の値を更新する機会はありません。それは主キーであり、' msguuid'は現在のタイムスタンプタイムアウトであるため更新されません。 https:// opencredoのアドバイスを受ける前にもっと学んでください。 –

+0

@AshrafulIslam元のテーブル定義に従って、「ページ」を主キーとして使用したことはありませんでした。チェックしてください。だから、更新された可能性があり、MVは墓石になります。 – dilsingi

関連する問題