web-dev-qa-db-ja.com

Python read Cassandra data into pandas

Cassandraデータをパンダに読み込むための適切な最速の方法とは何ですか?今、次のコードを使用していますが、非常に遅いです...

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では、結果全体(約4万行)が1分以内に得られます。

ありがとうございました!!!

17
ragesz

私は公式 メーリングリスト (それは完全に動作します)で答えを得ました:

こんにちは、

独自のpandas行ファクトリーを定義してみてください:

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

それは私がそれをする方法です-それはより速いはずです...

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

マイケル

35
ragesz

私がしていること(python 3))は:

query = "SELECT ..."
df = pd.DataFrame(list(session.execute(query)))
11
George C

私はCassandraからmssqlへのデータの移動に取り組んでおり、参照のためにここで与えられた回答を使用しました。データを移動することはできますが、ソーステーブルはcassandra =は巨大で、クエリはcassandraからタイムアウトエラーを受け取ります。タイムアウトを増やすことはできず、クエリでバッチで行を選択するオプションしか残っていないため、コードはまた、cassandraコレクションデータ型をmssqlに挿入して解析するため、コレクションデータ型をstrに変換します。同様の問題が発生した場合は、私が作成したコードを以下に示します。

import sys
import pandas as pd
import petl as etl
import pyodbc
import sqlalchemy
from cassandra.auth import PlainTextAuthProvider
from cassandra.cluster import Cluster
from sqlalchemy import *
from cassandra.query import SimpleStatement


def pandas_factory(colnames, rows):
    return pd.DataFrame(rows, columns=colnames)
    engine = sqlalchemy.create_engine('sql_server_connection string')

cluster = Cluster(
    contact_points=['cassandra_Host'], 
    auth_provider = PlainTextAuthProvider(username='username', password='passwrd')
)

session = cluster.connect('keyspace',wait_for_all_pools=True)

session.row_factory = pandas_factory
request_timeout = 60000
query = "SELECT * FROM cassandratable"
statement = SimpleStatement(query, fetch_size=5000) 
rows = session.execute(statement)

df = rows._current_rows
df['attributes'] = df.attributes.astype(str)
df['attributesgenerated'] = df.attributesgenerated.astype(str)
df['components'] = df.components.astype(str)
df['distributioncenterinfo'] = df.distributioncenterinfo.astype(str)
df['images'] = df.images.astype(str)
df['itemcustomerzonezoneproductids'] = 
df.itemcustomerzonezoneproductids.astype(str)
df['itempodconfigids'] = df.itempodconfigids.astype(str)
df['keywords'] = df.keywords.astype(str)
df['validationmessages'] = df.validationmessages.astype(str)
df['zones'] = df.zones.astype(str)
#error_bad_lines=False
#print(df)
df.to_sql(
           name='mssql_table_name',
           con=engine,
           index=False,
           if_exists='append',
           chunksize=1
         )
0
Alok Garg

読み込む最速の方法Cassandraデータを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)

dictionary ={"column1":[],"column2":[]}

for row in session.execute(sql_query):
    dictionary["column1"].append(row.column1)
    dictionary["column1"].append(row.column1)

df = pd.DataFrame(dictionary)
0
KRISHNA