2013-06-05 22 views
4

我有一個Cassandra 1.2集羣,我使用的是使用cql庫的Python。現在我需要實現一個看起來很簡單的使用get_slice一些分頁功能,但我不能找到如何從定製列表庫中使用這樣的任何文件:Cassandra分頁:如何使用get_slice從Python使用cql庫查詢Cassandra 1.2數據庫

get_slice("key" : table_key, 
     "column_parent" : {"column_family" : "MyColumnFamily"}, 
     "predicate" : 
     { "slice_range" : 
{ "start" : "SomeStartID", 
"end" : "Z", 
"reverse" : "false", 
"count : "100" } 
}) 

我見過這種類型的語法關於get_slice的隨機文檔,它看起來不像CQL 3語法,我怎樣才能將這種類型的查詢從Python運行到Cassandra 1.2集羣?,這是使用get_slice的當前方式,還是存在新的語法或CQL 3替代?

在此先感謝!

+0

這裏是一個[密切相關的問題](http://stackoverflow.com/questions/17664438/iterating-through-cassandra-wide-row-with-cql3)。 – JnBrymn

回答

4

您可以採用幾乎相同的方式進行分頁:設置限制並從大於先前收到的列名開始。作爲一個例子,我在密鑰空間ks1中創建了一個表test1:

CREATE TABLE test1 (
    a text, 
    b text, 
    PRIMARY KEY (a, b) 
) 

這裏a是我的行鍵,b是列名。然後插入12條記錄,a = a和b從a到l。所以

cqlsh:ks1> select * from test1; 

a | b 
---+--- 
a | a 
a | b 
a | c 
a | d 
a | e 
a | f 
a | g 
a | h 
a | i 
a | j 
a | k 
a | l 

然後我分頁使用的CQL驅動這條巨蟒:

import cql 
con = cql.connect('localhost', keyspace='ks1', cql_version='3.0.0') 
cursor = con.cursor() 
last = "" 
while last != None: 
    cursor.execute("select * from test1 where a=:a and b>:b limit 5", {"a": "a", "b": last}) 
    last = None 
    for row in cursor: 
     print row 
     last = row[1] 

哪些頁面中的5批次的輸出是:

[u'a', u'a'] 
[u'a', u'b'] 
[u'a', u'c'] 
[u'a', u'd'] 
[u'a', u'e'] 
[u'a', u'f'] 
[u'a', u'g'] 
[u'a', u'h'] 
[u'a', u'i'] 
[u'a', u'j'] 
[u'a', u'k'] 
[u'a', u'l'] 
+0

當然,你可以做到這一點,但get_slice功能有一個「反向」,可以讓你得到下一頁/上一頁,這是我真正感興趣的。有沒有一種方法使用普通的CQL 3,而沒有保存以前的鍵? –

+0

你不能在get_slice中使用反向進行分頁,它只能得到最後N列而不是第一列。您可以使用ORDER BY在CQL中進行反向查詢。 – Richard

+0

每[我的相關問題](http://stackoverflow.com/questions/17664438/iterating-through-cassandra-wide-row-with-cql3)你會如何擴展你的結果在PRIMARY KEY是三重的情況下(或者更多)? – JnBrymn

0

的現代版本的更新卡桑德拉。所有的CQL3原生驅動程序都可以使用服務器端分頁(從Cassandra 2.0開始),因此不需要再手動設置它的麻煩。

+2

您可以解釋一下如何使用CQL3實現分頁。 – Justin

+0

使用當前的CQL3驅動程序之一,它們會自動完成。 – Zanson

+5

你能舉個例子嗎? – zehelvion

相關問題