在 dask 中设置 Parquet 输出文件的大小

Posted

技术标签:

【中文标题】在 dask 中设置 Parquet 输出文件的大小【英文标题】:set size of Parquet output files in dask 【发布时间】:2018-07-09 15:39:35 【问题描述】:

当使用 dask dataframe to_parquet 方法时,有什么方法可以像 spark 一样设置默认的 parquet 文件大小?

我的问题是,当我使用 partition_on kwarg 保存它时,每个分区目录都会有几个小文件,因此使用“Amazon Athena”会导致查询速度非常慢。

中间的期望结果(如果文件大小控制不可用)是每个分区目录 n 个文件(现在 1 个就足够了)。

我认为保证每个分区目录 1 个文件的唯一方法是重新分区到一个分区,然后使用 to_parquet 方法(但是效率非常低)。

有没有更好的办法?

【问题讨论】:

【参考方案1】:

当前的行为是设计使然,允许每个工作人员独立处理一个分区,并写入没有其他进程正在写入的文件。否则,将需要某种锁定,或者在为每个目录写入之后进行一些合并步骤。

您可以做的是使用set_index 将数据洗牌到一个分区中,以便为您要分区的列的每个值(可能使用divisions= 关键字);现在 to_parquet 将为每个这些值生成一个文件。如果您希望文件自动结束在正确的目录中,并修剪现在冗余的索引,您可能需要使用 to_delayed() 并创建一个延迟函数,该函数采用一个分区(一个 pandas 数据帧)并将其写入正确的位置。

【讨论】:

但这不适用于多列(因为 dask 不支持多索引)。如果我使用to_delayed 函数,它会写入通用元数据吗? 你可以用 groupby 做类似的事情,然后“应用”一个函数来完成写作。

以上是关于在 dask 中设置 Parquet 输出文件的大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 Dask 从多个 Python 进程编写 Parquet 文件

python dask to_parquet 占用大量内存

使用dask有效地从blob存储上的parquet文件中读取一些列[重复]

如何使用 dask/fastparquet 从多个目录中读取多个 parquet 文件(具有相同架构)

使用 to_parquet() 将 dask 数据帧写入镶木地板结果“RuntimeError:文件元数据仅在写入器关闭后可用”

使用 dask read_parquet 方法过滤会产生不需要的结果