Python Cassandra получить большой результат выбора * в генераторе (без памяти в RAM)

1

Я хочу получить все данные в таблице 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 первых пользователей в списке запросов2 содержит 100 "вторых" пользователей в списке запросов n содержит последние элементы запроса (<= 100)

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

Теги:
cassandra

1 ответ

1

Согласно Paging Large Queries:

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню