2016-12-20 4 views
7

Was ist das richtige und schnellste Weg Cassandra Daten in Pandas lesen? Jetzt benutze ich den folgenden Code, aber es ist sehr langsam ...Python gelesen Cassandra Daten in Pandas

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) 

Lese 1000 Zeilen dauert nur 1 Minute, und ich habe ein „bisschen mehr“ ... Wenn ich die gleiche Abfrage zB laufen. In DBeaver bekomme ich die ganzen Ergebnisse (~ 40k Zeilen) innerhalb einer Minute.

Danke !!!

+0

Wenn die Ausgabe von 'session.execute (sql_query)' eine Liste von dicts ist, würde ich nur versuchen, 'df = pd.DataFrame (session.execute (sql_query))' oder führen Sie 'pd.DataFrame' in einem Teil dieser Liste aus. Das Hinzufügen von Zeilen zu einem Datenrahmen einzeln ist ineffizient. – ptrj

+0

Das Ergebnis von 'session.execute (sql_query)' ist ein spezielles ' 'iterables Objekt. Seine Zeilen können Tupel, Named_Tuples oder Dictionaries sein. – ragesz

+0

Ich verstehe. Dennoch ist es besser, es zuerst in eine Liste zu konvertieren, zum Beispiel 'lst = []; für row in session ...: lst.append (row) 'wenn nichts anderes funktioniert. Und dann verketten Sie die Ergebnisse: 'df = pd.concat (lst)'. Auf diese Weise können Sie kostspielige 40k-Aufrufe von 'pd.DataFrame.append' vermeiden. – ptrj

Antwort

13

bekam ich die Antwort auf der offiziellen mailing list (es funktioniert perfekt):

Hallo,

versuchen Sie Ihre eigene Pandas Reihe Fabrik zu definieren:

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 

das ist der Weg i tun Sie es - ein sollte es schneller sein ...

Wenn Sie eine schnellere Methode finden - interessiert mich :)

Michael

3

Was ich tun (in Python 3):

query = "SELECT ..." 
df = pd.DataFrame(list(session.execute(query))) 
Verwandte Themen