【问题标题】:How do I get a DASK dataframe into a MySQL datatable?如何将 DASK 数据帧放入 MySQL 数据表?
【发布时间】:2020-03-26 16:37:06
【问题描述】:
我从 CSV 文件中获取数据,并在我的 Dask 数据框中保存和操作。从那里我需要将数据写入数据表。我还没有真正遇到过任何解决方案。 Pandas 的 to_sql 函数为此提供了内置功能,所以我不确定是否需要先转换为 Pandas?我目前认为将 Dask 数据帧转换为 Pandas 会导致它完全加载到内存中,这可能会破坏首先使用 Dask 的目的。
将 Dask 数据帧写入数据表的最佳和最快方法是什么?
【问题讨论】:
标签:
python
dask
dask-dataframe
【解决方案1】:
假设你有 dask 数据框作为 df,你只需要这个:
df.to_sql(table, schema=schema, uri=conn_str, if_exists="append", index=False)
我发现这很容易成为 dask 数据帧的最快方法。
【解决方案2】:
我对@kfk 的回答没有任何问题,因为我也对此进行了调查,但我的解决方案如下。
我将 DASK 数据帧放到 csv 中,然后使用 Golang 应用程序从那里提取 CSV,该应用程序使用多线程将数据推送到 Mongo。对于 450 万行,速度从使用“加载本地 infile”的 38 分钟提高到使用多线程应用程序的 2 分钟。
【解决方案3】:
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。