【发布时间】:2017-05-05 23:11:07
【问题描述】:
将 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)
读取 1000 行需要 1 分钟,而我还有“多一点”... 如果我运行相同的查询,例如。在 DBeaver 中,我可以在一分钟内获得全部结果(约 40k 行)。
谢谢!!!
【问题讨论】:
-
如果
session.execute(sql_query)的输出是一个字典列表,我会尝试df = pd.DataFrame(session.execute(sql_query))或在该列表的某些部分运行pd.DataFrame。将行逐一追加到数据帧是低效的。 -
session.execute(sql_query)的结果是一个特殊的<cassandra.cluster.ResultSet at 0x1b4b61d0>可迭代对象。它的行可以是元组、named_tuples 或字典。 -
我明白了。不过,最好先将其转换为列表,例如
lst=[]; for row in session...: lst.append(row),如果没有其他方法。然后连接结果:df = pd.concat(lst)。这样您就可以避免对pd.DataFrame.append进行昂贵的 4 万次调用。