为啥 dask 的“to_sql”比 pandas 花费更多时间?

Posted

技术标签:

【中文标题】为啥 dask 的“to_sql”比 pandas 花费更多时间?【英文标题】:Why dask's "to_sql" is taking more time than pandas?为什么 dask 的“to_sql”比 pandas 花费更多时间? 【发布时间】:2021-09-27 05:21:39 【问题描述】:

我使用 dask 而不是 pandas 进行 ETL,即从 S3 存储桶读取 CSV,然后进行一些转换。直到这里 - dask 比 pandas 更快地读取和应用转换!

最后,我使用 to_sql 将转换后的数据转储到 Redshift。 dask 中的 to_sql 转储比 pandas 花费的时间更多。

是否可以减少所花费的时间?如果不是,为什么在这种情况下 dask 比 pandas 慢?

【问题讨论】:

你确定它没有使用“延迟执行” - 也就是说,它仅在调用转储时才进行所有处理。你在用parallel参数吗? 不,也许我应该用compute=Trueparallel=True 再试一次? @JithendraYenugula 您的问题还有很多要补充:处理的数据有多大? pandas 和 dask to_sql 秒有什么区别?理想情况下,您需要发布带有所有参数的 pandas 和 dask to_sql 表达式。 我在两种情况下试验了 dask。 1)将 10 万行数据帧转储到 RedShift 需要 5 分钟,现在,2)转储 200 万行数据帧需要 20*5 分钟!大于1.5小时!我正在使用这个 - dask.DataFrame.to_sql(chunksize=10000,compute=True,parallel=True, method='multi') 。有什么办法可以优化这个?因为超过 1 小时的 RedShift 将使我在 ETL 管道中使用 EC2 而不是 Lambda! 【参考方案1】:

Dask DataFrames 由不同的分区组成,每个分区都是一个 Pandas DataFrame。当可以在每个分区上并行运行操作时,Dask I/O 速度很快。当您可以将 Dask DataFrame 写为 10 个文件时,这将比写一个文件更快。

写入数据库时​​的概念类似。如果你可以将所有分区并行写入数据库,那将比顺序写入要快得多。

to_sql 默认设置parallel=False。让我们看一下该参数的描述:

如果为 true,则让每个块同时将自身附加到 DB 表中。这可能导致 DB 行的顺序与源 DataFrame 的相应行不同。为 false 时,将每个块按顺序加载到 SQL DB 中。

您的一个 cmets 说“RedShift 超过 1 小时将使我在 ETL 管道中使用 EC2 而不是 Lambda”,这表明您可能在 Lambda 函数中使用 Dask?如果您在 Lambda 中运行此代码,而不是正确的 ec2 实例/集群,那么使用 aws-data-wrangler 写入 Redshift 可能是更好的选择。

【讨论】:

以上是关于为啥 dask 的“to_sql”比 pandas 花费更多时间?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas DataFrame.to_sql() 函数是不是需要后续的 commit()?

Pandas 与 to_sql 的 ODBC 连接

在 pandas.to_sql() 中使用“可调用”方法的示例?

使用 Pandas .to_sql 将 JSON 列写入 Postgres

pandas中的to_sql的使用

pandas.DataFrame.to_sql - 源 csv 文件和目标表的列顺序