我从 CSV 文件中获取数据,并在我的 Dask 数据框中保存和操作。从那里我需要将数据写入数据表。我还没有真正遇到过任何解决方案。Pandas 的 to_sql 函数为此提供了内置功能,所以我不确定是否需要先转换为 Pandas?我目前认为将 Dask 数据帧转换为 Pandas 会导致它完全加载到内存中,这可能会破坏首先使用 Dask 的目的。
将 Dask 数据帧写入数据表的最佳和最快方法是什么?
我从 CSV 文件中获取数据,并在我的 Dask 数据框中保存和操作。从那里我需要将数据写入数据表。我还没有真正遇到过任何解决方案。Pandas 的 to_sql 函数为此提供了内置功能,所以我不确定是否需要先转换为 Pandas?我目前认为将 Dask 数据帧转换为 Pandas 会导致它完全加载到内存中,这可能会破坏首先使用 Dask 的目的。
将 Dask 数据帧写入数据表的最佳和最快方法是什么?
假设你有 dask 数据框作为 df,你只需要这个:
df.to_sql(table, schema=schema, uri=conn_str, if_exists="append", index=False)
我发现这很容易成为 dask 数据帧的最快方法。
我对@kfk 的回答没有任何问题,因为我也对此进行了调查,但我的解决方案如下。
我将 DASK 数据帧放到 csv 中,然后使用 Golang 应用程序从那里拾取 CSV,该应用程序使用多线程将数据推送到 Mongo。对于 450 万行,速度从使用“加载本地 infile”的 38 分钟变为使用多线程应用程序的 2 分钟。
pandas.to_sql()
不是将数据加载到数据库中的最快方法。使用比内置批量加载方法慢to_sql()
很多的 ODBC 驱动程序连接。
您可以像这样从 MySQL 中的 csv 文件加载数据:
LOAD DATA INFILE 'some_file.csv'
INTO TABLE some_mysql_table
FIELDS TERMINATED BY ';'
所以我要做的是:
import dask.dataframe as dd
from sqlalchemy import create_engine
#1) create a csv file
df = dd.read_csv('2014-*.csv')
df.to_csv("some_file.csv")
#2) load the file
sql = """LOAD DATA INFILE 'some_file.csv'
INTO TABLE some_mysql_table
FIELDS TERMINATED BY ';"""
engine = create_engine("mysql://user:password@server")
engine.execute(sql)
您可以轻松地将上述内容包装成一个函数并使用它而不是to_sql
.