【问题标题】:pyarrow.parquet.write_to_dataset() extremely slow when using partition_colspyarrow.parquet.write_to_dataset() 使用 partition_cols 时速度极慢
【发布时间】:2019-11-20 17:12:35
【问题描述】:

我正在玩弄镶木地板文件,以了解它们是否适合我的目的。为此,我从 csv 文件加载数据集并将其保存为 parquet 数据集:

import pandas as pd          # version 0.25
import pyarrow as pa         # version 0.15
import pyarrow.parquet as pq

df = pd.read_csv('my.csv')

df_table = pa.Table.from_pandas(df)
pq.write_to_dataset(df_table, root_path='my.parquet')

这很好用而且很快(约 1 分钟)。但是,当我尝试编写这样的分区拼花数据集时,

pq.write_to_dataset(df_table, root_path='my.parquet', partition_cols=['id'])

需要半个多小时。这似乎很奇怪。我尝试将id 列设置为索引,但这并没有太大变化。我错过了什么吗?

文件的一些背景:~ 500 万行,9 列。 id 列包含约 330,000 个不同的值。将数据集划分成这么小的部分只是一个坏主意吗?


我对 Python 很陌生(我使用的是 3.6.4 版),所以我不确定我是否提供了所有相关信息。如有遗漏请评论。


编辑: 我发现在我的情况下,更少、更大的块更快。这导致了最佳块大小的问题。我在哪里可以找到这方面的信息?

【问题讨论】:

    标签: python pyarrow


    【解决方案1】:

    每个文件大约 15 行(500 万 / 330K)行,是的,对这样的小文件使用镶木地板是个坏主意。 parquet 中的元数据存在开销,并且压缩量将受到限制。基于 Parquet Documentation 行组大小约为 512-1024MB 是首选,但这是由于 HDFS。因此,不同的存储场景可能需要不同的大小。一般来说,对于小于 10 兆字节的文件,它可能没有意义。

    【讨论】:

    • 感谢您提供文档链接。以前一定错过了。所以我在本地机器上处理 parquet 文件的要点是:选择尽可能大的块大小,但要足够小,以便将尽可能多的块放入 RAM 中,因为你的机器上有内核。这有意义吗?
    • 这似乎是一个很好的经验法则,但我认为这可能取决于工作量(例如,您一次读回多少列)。
    猜你喜欢
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2015-02-07
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多