2016-12-20 3 views
7

CANDANDRAのデータをパンダに読み込むには、適切な方法との最速方法がありますか?今私は、次のコードを使用しますが、それは非常に遅いです...PythonはCANDANDRAデータをパンダに読み込みます

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) 

読書1000行は1分かかり、と私は同じクエリなどを実行する場合、私は ...「もう少し」を持っています。 DBeaverでは、1分以内に全体の結果(〜40k行)が得られます。

ありがとうございます!

+0

、私は試してみました'df = pd.DataFrame(session.execute(sql_query))'を実行するか、このリストの一部で 'pd.DataFrame'を実行してください。データフレームに行を1つずつ追加することは非効率的です。 – ptrj

+0

'session.execute(sql_query)'の結果は、特殊な '' iterableオブジェクトです。その行は、タプル、名前付きタプルまたは辞書にすることができます。 – ragesz

+0

私は参照してください。それでも、最初にリストに変換する方がいいです。例えば、 'lst = [];セッション内の行のために::lst.append(row) 'それ以外は何も動作しません。そして結果を連結する: 'df = pd.concat(lst)'。このようにして、 'pd.DataFrame.append'への40kの高価な呼び出しを避けることができます。 – 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 

方法私だことそれを行う - それは速くなる必要があります...

あなたが高速な方法を見つけるなら - 私は興味があります:)

マイケル

私は(のpython 3で)何
3

は次のとおりです。session.execute(sql_query) `の出力は` dictsのリストである場合

query = "SELECT ..." 
df = pd.DataFrame(list(session.execute(query))) 
関連する問題