2016-12-20 3 views
7

Что является правильным и самым быстрым способом читать данные Кассандры в панды? Теперь я использую следующий код, но это очень медленно ...Python читает данные Кассандры в пандах

import pandas as pd 

from cassandra.cluster import Cluster 
from cassandra.auth import PlainTextAuthProvider 
from cassandra.query import dict_factory 

auth_provider = PlainTextAuthProvider(username=CASSANDRA_USER, password=CASSANDRA_PASS) 
cluster = Cluster(contact_points=[CASSANDRA_HOST], port=CASSANDRA_PORT, 
    auth_provider=auth_provider) 

session = cluster.connect(CASSANDRA_DB) 
session.row_factory = dict_factory 

sql_query = "SELECT * FROM {}.{};".format(CASSANDRA_DB, CASSANDRA_TABLE) 

df = pd.DataFrame() 

for row in session.execute(sql_query): 
    df = df.append(pd.DataFrame(row, index=[0])) 

df = df.reset_index(drop=True).fillna(pd.np.nan) 

Reading 1000 строк занимает 1 минуту, и у меня есть «немного больше» ... Если я запускаю тот же запрос, например. в DBeaver, я получаю все результаты (~ 40k строк) в течение минуты.

спасибо !!!

+0

Если выход 'session.execute (sql_query)' список dicts, я хотел бы попробовать просто 'df = pd.DataFrame (session.execute (sql_query))' или запустить 'pd.DataFrame' в некоторой части этого списка. Добавление строк в кадр данных один за другим неэффективно. – ptrj

+0

Результат 'session.execute (sql_query)' является специальным ' итерируемом объекте. Его строками могут быть кортежи, named_tuples или словари. – ragesz

+0

Я вижу. Тем не менее, лучше сначала преобразовать его в список, например 'lst = []; для строки в сеансе ...: lst.append (строка) ', если ничего не работает. И затем соедините результаты: 'df = pd.concat (lst)'. Таким образом, вы могли бы избежать дорогостоящих вызовов 40k на 'pd.DataFrame.append'. – ptrj

ответ

13

я получил ответ на официальный mailing list (это работает отлично):

Привет,

попробовать определить свою собственную панду строки завод:

def pandas_factory(colnames, rows): 
    return pd.DataFrame(rows, columns=colnames) 

session.row_factory = pandas_factory 
session.default_fetch_size = None 

query = "SELECT ..." 
rslt = session.execute(query, timeout=None) 
df = rslt._current_rows 

Вот так я сделайте это - оно должно быть быстрее ...

Если вы найдете более быстрый метод - меня интересует :)

Майкл

3

Что мне делать? (В питоне 3):

query = "SELECT ..." 
df = pd.DataFrame(list(session.execute(query))) 
Смежные вопросы