Разбивка на страницы Cassandra: как использовать get_slice для запроса базы данных Cassandra 1.2 из Python с использованием библиотеки cql

У меня есть кластер Cassandra 1.2, и я использую его из Python с помощью библиотеки cql. Теперь мне нужно реализовать некоторые функции подкачки, которые кажутся довольно простыми, используя get_slice, но я не могу найти никакой документации о том, как использовать что-то подобное из библиотеки cql:

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?

Заранее спасибо!


person Sergio Ayestarán    schedule 05.06.2013    source источник
comment
Вот близкий вопрос.   -  person JnBrymn    schedule 24.07.2013


Ответы (2)


Вы можете сделать разбиение по страницам примерно таким же образом: установить ограничение и начать с имени столбца, большего, чем полученное ранее. В качестве примера я создал таблицу test1 в пространстве ключей ks1:

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

Затем я перешел к этому python с помощью драйвера 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']
person Richard    schedule 06.06.2013
comment
Конечно, вы можете сделать это, но функциональность get_slice имеет реверс, чтобы позволить вам получить следующую/предыдущую страницу, это то, что меня действительно интересует. Есть ли способ сделать это с помощью простого CQL 3 и без сохранения предыдущего ключи? - person Sergio Ayestarán; 06.06.2013
comment
Вы не можете использовать reverse в get_slice для подкачки страниц, все, что он может сделать, это получить последние N столбцов, а не первый. Вы можете выполнять обратные запросы в CQL с помощью ORDER BY. - person Richard; 07.06.2013
comment
Согласно моему связанному вопросу, как бы вы расширили свой результат в случае, если ПЕРВИЧНЫЙ КЛЮЧ - это тройка (или больше)? - person JnBrymn; 24.07.2013

Обновление для современных версий Cassandra. Все нативные драйверы CQL3 могут использовать пейджинг на стороне сервера (начиная с Cassandra 2.0), поэтому больше не нужно настраивать его вручную.

person Zanson    schedule 15.12.2014
comment
Не могли бы вы объяснить, как добиться разбивки на страницы с помощью CQL3? - person Justin; 25.03.2015
comment
Используйте один из текущих драйверов CQL3, и они сделают это автоматически. - person Zanson; 27.03.2015
comment
Можете ли вы привести пример? - person AturSams; 06.08.2015