在 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 文件
使用dask有效地从blob存储上的parquet文件中读取一些列[重复]
如何使用 dask/fastparquet 从多个目录中读取多个 parquet 文件(具有相同架构)
使用 to_parquet() 将 dask 数据帧写入镶木地板结果“RuntimeError:文件元数据仅在写入器关闭后可用”