Python Cassandra получить большой результат выбора * в генераторе (без памяти в RAM) - PullRequest
0 голосов
/ 10 октября 2018

Я хочу получить все данные в таблице cassandra "user"

У меня 840000 пользователей, и я не хочу, чтобы все пользователи находились в списке Python.я хочу получить пользователей в пакетах по 100 пользователей

в cassandra doc https://datastax.github.io/python-driver/query_paging.html я вижу, что могу использовать fetch_size, но в моем коде python у меня есть объект базы данных, который содержит все инструкции cql

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

class Database:
   def __init__(self, name, salary):
        self.cluster = Cluster(['192.168.1.1', '192.168.1.2'])
        self.session = cluster.connect()

   def get_users(self):
        users_list = []
        query = "SELECT * FROM users"
        statement = SimpleStatement(query, fetch_size=10)
        for user_row in session.execute(statement):
            users_list.append(user_row.name)
        return users_list

на самом деле get_users возвращает очень большой список имен пользователей, но я хочу преобразовать return get_users в «генератор»

Я не хочу получать имена всех пользователей в 1 списке и 1 вызов функции get_users,но я хочу иметь много вызовов get_users и список возвратов с максимум 100 пользователями для каждой функции вызова

, например: list1 = database.get_users () list2 = database.get_users () ... listn = database.get_users ()

list1 содержит 100 первых пользователей в запросе list2 содержит 100 «вторых» пользователей в запросе listn содержит последние элементы в запросе (<= 100) </p>

возможно ли это?спасибо за аванс за ваш ответ

1 Ответ

0 голосов
/ 11 октября 2018

В соответствии с Большие запросы на пейджинг :

Если на текущей странице больше нет строк, следующая страница будет извлечена прозрачно.

Таким образом, если вы выполняете свой код таким образом, вы все равно получите весь набор результатов, но он прозрачно разбит на страницы.

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

Я добавил ниже полный код для справки.

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

class PagedResultHandler(object):

    def __init__(self, future):
        self.error = None
        self.finished_event = Event()
        self.future = future
        self.future.add_callbacks(
            callback=self.handle_page,
            errback=self.handle_error)

    def handle_page(self, rows):
        for row in rows:
            process_row(row)

        if self.future.has_more_pages:
            self.future.start_fetching_next_page()
        else:
            self.finished_event.set()
    def handle_error(self, exc):
        self.error = exc
        self.finished_event.set()

def process_row(user_row):
    print user_row.name, user_row.age, user_row.email

cluster = Cluster()
session = cluster.connect()

query = "SELECT * FROM myschema.users"
statement = SimpleStatement(query, fetch_size=5)

future = session.execute_async(statement)
handler = PagedResultHandler(future)
handler.finished_event.wait()
if handler.error:
    raise handler.error
cluster.shutdown()

Переход на следующую страницу выполняется в handle_page, когда start_fetching_next_page

Если вы замените оператор if на self.finished_event.set(), вы увидите, что итерация останавливается после первых 5 строк, как определено в fetch_size

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...