пагинация драйвера python не работает

У меня есть код ниже для использования драйвера python cassandra для разбивки на страницы

Я пробовал как переопределить запрос, так и установить сеанс default_fetch_size. но ни один из них не работает, результаты всегда все строки из таблицы. что мне не хватает?

from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement

# setup
cluster = Cluster(["10.40.10.xxx","10.40.10.xxx","10.40.22.xxx","10.40.22.xxx"])
session = cluster.connect()
session.set_keyspace("ad_realtime")
# session.default_fetch_size = 10

query = "SELECT * from campaign_offset"
statement = SimpleStatement(query, fetch_size=10)
results = session.execute(statement)

for row in results:
   print row

person del bao    schedule 09.02.2017    source источник


Ответы (3)


Пейджинг в драйвере Python не означает получение только части вашего запроса. Это означает, что вы будете получать только части вашего запроса за раз.

Ваш код

for row in results:
   print row

Вызывает механизм подкачки. По сути, это создание итератора, который запрашивает только fetch_size строк за раз из набора результатов, определенного вашим запросом.

Используйте предложения LIMIT и WHERE, чтобы ограничить фактический результат. разбиение на страницы cassandra: разница между драйвером и CQL

person RussS    schedule 09.02.2017
comment
comment
@RussS: Когда данные фактически берутся с сервера Cassandra: 1 или 2? 1. results = session.execute(statement) 2. for row in results: print row Если данные извлекаются с сервера партиями по размеру выборки, означает ли это, что запросы лениво оцениваются. Если нет, извлекает ли results = session.execute(statement) все данные с сервера или их необходимо извлекать, как показано в 2, чтобы получить данные в размере клиента? - person Atish; 12.03.2020
comment
Оба. Execute получит первую страницу. После итерации до конца страницы выбирается следующая. Запрос немедленно обрабатывается, но последующие страницы выбираются лениво. Объект набора результатов также имеет методы для получения всего результата сразу, если хотите. - person RussS; 12.03.2020

Вы можете получить строки текущей страницы, используя current_rows, например:

for row in results.current_rows:
    print row
person Mardiko    schedule 05.12.2017

Следующий код может помочь вам получить результаты с разбивкой на страницы:

def fetch_rows(stmt: Statement, fetch_size: int = 10):
    stmt.fetch_size = fetch_size
    rs: ResultSet = session.execute(stmt)
    has_pages = rs.has_more_pages
    while has_pages:
        yield from rs.current_rows
        print ('-----------------------------------------')
        has_pages = rs.has_more_pages
        rs = session.execute(ps, paging_state=rs.paging_state)

def execute():
    query = "SELECT  col1, col2 FROM my_table WHERE some_partition_key='part_val1' AND some_clustering_col='clus_val1'"
    ps = session.prepare(query)
    for row in fetch_rows(ps, 20):
        print(row)
        # Process the row and perform desired operation
person Suyash Soni    schedule 27.08.2020