2014-11-22 18 views
1

我的表有77K項(參賽人數不斷增加該高速率),我需要做一個選擇查詢在CQL 3.當我做select count(*) ... where (some_conditions) allow filtering我得到:Cassandra:如何查詢完整的數據集?

count 
------- 
10000 

(1 rows) 

Default LIMIT of 10000 was used. Specify your own LIMIT clause to get more results. 

比方說,23K行滿意這some_condition。以上10000計數是這23k行的前10k行,對嗎?但是,我如何得到實際的計數?

更重要的是,如何訪問所有這23k行,以便我的python api可以對某些行中的數據執行一些內存中操作。在Cassandra CQL 3中是否存在一些排序分頁原則:

我知道我可以將限制增加到非常大的數字,但這樣做效率不高。

回答

1

你只需要指定限制與您的查詢。

我們假設您的數據庫包含1條缺少的記錄,所以如果您執行下面的查詢,它會爲您提供表中記錄的實際數量。

select count(*)... where(some_conditions)allow filtering limit 100000;

+0

但是,這是一種有效的方法嗎?這是對結果的限制還是對'where'子句查詢的數據集的限制。它看起來像是對結果行的限制,而不是要查詢的數據集。因爲如果它在數據集上,那麼表中的所有前10k個條件都不滿足where子句中的條件是不太可能的。 @Working Hard .. – extraDarker 2014-11-22 10:35:36

+0

它在結果集上,你可以用where子句或沒有任何查詢來指定限制。我更新了我的答案。只是檢查。 – 2014-11-22 10:39:57

+0

@extraDarker如果你真的擔心效率,那麼你應該重構你的查詢/模型來擺脫'ALLOW FILTERING'。 – Aaron 2014-11-22 14:20:30

4

努力工作是正確的,而LIMIT可能是你想要的。但是,如果您想更詳細地「瀏覽」結果,請閱讀標題爲「Paging through unordered partitioner results」的DataStax文檔。

這將涉及在您的分區鍵上使用token函數。如果你想得到更詳細的幫助,你必須發佈你的模式。

雖然我看不到您的完整表格架構,但由於您使用的是ALLOW FILTERING這一事實,我可以判斷您做錯了什麼。 Cassandra的設計不是基於多個二級索引來提供數據。這種方法可能適用於RDBMS,但隨着時間的推移,查詢會變得非常慢。你應該設計一個列族(表)來適應你打算頻繁使用的每個查詢。 ALLOW FILTERING不是一個長期的解決方案,並且應該在生產系統中使用永不

0

另一種方法是編寫python代碼,cqlsh確實是python腳本。

使用

聲明= 「SELECT COUNT(*)從SOME_TABLE」

未來= session.execute_async(聲明)

行= future.result()

數= 0 行爲行: count = count + 1

以上是使用cassandra python驅動程序PAGE QUERY功能。