【问题标题】:Using dask.DataFrame.to_parquet() to write large file使用 dask.DataFrame.to_parquet() 写入大文件
【发布时间】:2021-05-14 10:07:46
【问题描述】:

我有一个 .pq 文件(大约 2Gb),我想在其中使用 dask 更改列名。

我没有问题将文件读取到 dask DataFrame 并且我能够重命名列。 但是,当使用 ddf.to_parquet() 将 .pq 文件写回磁盘时,该作业会失败,因为 dask 似乎试图将其放入内存中(但它不适合)。

为什么会这样?我预计 dask 会迭代地执行此操作。如何分块写入目标文件?

下面是我正在使用的代码。

import dask.dataframe as dd

ddf = dd.read_parquet(
    '/path/to/file/file.pq',
    engine='pyarrow'
)

ddf = ddf.rename(columns={'old_column_name': 'new_column_name'})

# the step which fails
ddf.to_parquet(
    '/path/to/file/edited/',
    engine='pyarrow',
    write_index=False
)

提前致谢!

【问题讨论】:

  • 你得到什么错误?在您执行to_parquet 之前,它不会读取实际数据。这就是为什么如果它与内存相关,它只会在最后一步失败。尝试更改 read_parquet 的 chunksize 参数。我想知道是否有为什么在不阅读整个内容的情况下更改磁盘上的列名...
  • 不,没有方便的方法来就地更改列名。使用字节编辑,您也许可以使用与原始名称相同长度的名称。

标签: python pandas dask parquet


【解决方案1】:

Dask 确实以块的形式加载您的数据,并将它们以块的形式写入输出。总内存使用量取决于

  • 每个块的大小,在 parquet 中称为“行组”,不可分割。解压解码后需要内存大小
  • 您一次处理的块数,如果您不进行其他配置,可能是您的 CPU 中的内核数

请注意,在处理过程中还需要一些中间值,因此您通常希望每个工作人员的每个线程都能够处理超过一个数据块的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多