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 !!!
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
Das Ergebnis von 'session.execute (sql_query)' ist ein spezielles ' 'iterables Objekt. Seine Zeilen können Tupel, Named_Tuples oder Dictionaries sein. –
ragesz
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