Python 在分区数据集上使用Dask时_元数据文件的重要性

Python 在分区数据集上使用Dask时_元数据文件的重要性,python,dask,Python,Dask,我有一个简单的理解,关于拼花地板数据集中文件的信息可以放在\u元数据文件中,并用于。然而,当我使用Dask到带有append=True和write\u metadata\u file=True的拼花地板时遇到性能问题,下面是我的完整命令。(我还没有完全理解发生了什么,但我的记忆会突然增强,就在to_拼花地板被分给工人之前)。一、 因此,决定设置write\u metadata\u file=False,并在没有\u metadata文件的情况下继续,删除先前创建的\u metadata文件 我发

我有一个简单的理解,关于拼花地板数据集中文件的信息可以放在
\u元数据
文件中,并用于。然而,当我使用Dask
到带有
append=True
write\u metadata\u file=True
的拼花地板时遇到性能问题,下面是我的完整命令。(我还没有完全理解发生了什么,但我的记忆会突然增强,就在
to_拼花地板
被分给工人之前)。一、 因此,决定设置
write\u metadata\u file=False
,并在没有
\u metadata
文件的情况下继续,删除先前创建的
\u metadata
文件

我发现问题消失了,而且
到_parquet
的速度也不慢,如果说我节省了时间的话,那就是每次都不必编写
\u元数据
文件

此外,当我
读取_parquet
文件时,如果没有
\u元数据
文件,也不会像我预期的那样导致性能不佳

我选择在追加时进行分区,不知道这是不是
\u元数据
文件不那么重要的原因,还是不正确?当元数据
文件很重要而不是很重要时,是否存在明显的情况

代码的简单示例

dd.to_parquet(df,
              engine='fastparquet',
              path=uri, storage_options=dl.storage_options,
              partition_on=['A', 'B', 'C'],
              append=True,
              ignore_divisions=True,
              write_metadata_file=False)

元数据文件提供了三个可能有用的功能:

  • 所有组成分区的文件名
  • 列块的每个文件中的偏移量
  • 每个列块中值的最小/最大统计信息
  • 数据集的模式可以从_common_元数据文件或任何一个数据文件中读取
第一个是通过列出文件系统很容易找到的,它在本地很快,但是如果有数千个文件,远程存储可能会很慢

第二个是必需的,但可以从每个数据文件的页脚、辅助任务和并行任务中读取。因此,如果您没有提前获得它们,您最终会做更多的工作,但可能不会注意到(尤其是当每个部分都有许多行时)。与在客户端解析一个巨大的元数据文件相比,它可能会更快

第三个,如果不是从元数据文件中获取的,则只能通过扫描所有文件的元数据页脚来获取,这可能会非常缓慢,而且在客户端是单线程完成的。但是,如果您不使用这些统计信息进行过滤(gather_statistics=None或False),那么您完全可以不使用这些统计信息。 您仍然可以在没有max/min统计的情况下对分区列进行筛选


最后,为了完整性:为什么带元数据的分区追加速度慢?每次追加时都必须重写单个元数据文件,它首先需要从每个任务中获取所有元数据。我还需要在内存中保存所有元数据。这可能做得更好,但这是当前的实现。

感谢您的快速响应,我感觉在进行统计时,元数据文件真的有了自己的功能。考虑到我不是,并且在当前的实现中,当附加拼花地板是很慢的时候,我认为没有元数据文件的代价是存在的。