2017-06-03 80 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行。

如果我嘗試類似:SELECT * FROM test.comments WHERE page = 'test' AND timestamp < 1496468332,我得到這個錯誤:

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" 

我寧願不使用允許過濾,我希望查詢儘可能快。

我在另一個問題計算器看着這裏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

而不是使用索引創建Materialized View

創建的分區鍵頁面物化視圖和msguuid按降序聚集鍵順序。

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); 

雖然使用的是msguuid作爲當前時間戳的timeuuid,你的數據將按時間倒序排列。

爲了得到最後50行中的頁面的使用下面的查詢:

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

在卡桑德拉世界嘗試根據它需要滿足的查詢來建模你的表。如果查詢總是由where子句「頁」和msguuid僅僅是有唯一性的重新設計表格類似如下

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訂單並沒有任何要求有物化視圖的額外開銷。

+1

謝謝,我很高興有一種方法可以在沒有開銷的情況下完成。相反,我將你標記爲答案。 –

+0

@dilsingi我的解決方案不會生成墓碑。 MV只生成墓碑如果MV的主鍵'page'和'msguuid'更新了基表。對於他的情況,沒有機會更新'page'的值,因爲它是他的主鍵,而'msguuid'也不會被更新,因爲它是當前時間戳timeuuid。在諮詢任何人https:// opencredo之前瞭解更多信息。com/everything-need-know-cassandra-materialized-views/ –

+0

@AshrafulIslam根據原始表定義,它從來沒有將「頁面」作爲主鍵。請檢查。所以它可能會被更新,MV會導致墓碑。 – dilsingi