Python将Cassandra数据读入熊猫

rag*_*esz 17 python 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)

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)
Run Code Online (Sandbox Code Playgroud)

读取1000行需要1分钟,我有一点"更多"...如果我运行相同的查询,例如.在DBeaver中,我在一分钟内得到了整个结果(~40k行).

谢谢!!!

rag*_*esz 34

我在官方邮件列表中得到了答案(它完美地运行):

嗨,

尝试定义自己的pandas row factory:

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
Run Code Online (Sandbox Code Playgroud)

这就是我这样做的方式 - 它应该更快......

如果你找到一个更快的方法 - 我很感兴趣:)

迈克尔

  • 这应该标记为答案,它整洁,简洁且通用。 (2认同)
  • 适合读取,但在写回数据时可能会出现问题,因为 pandas 必须猜测数据类型。例如:我读取了一个包含许多空行的 int 列,pandas 猜测为 float,然后 CQL 在插入类似表时给出错误,因为该列的类型错误。 (2认同)

Geo*_*e C 10

我所做的(在python 3中)是:

query = "SELECT ..."
df = pd.DataFrame(list(session.execute(query)))
Run Code Online (Sandbox Code Playgroud)