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

Posted

技术标签:

【中文标题】使用 to_parquet() 将 dask 数据帧写入镶木地板结果“RuntimeError:文件元数据仅在写入器关闭后可用”【英文标题】:Writing a dask dataframe to parquet using to_parquet() results "RuntimeError: file metadata is only available after writer close" 【发布时间】:2021-10-03 10:35:17 【问题描述】:

我正在尝试在镶木地板文件中使用存储 Dask 数据框。我已经安装了 pyarrow 库。

import numpy as np
import pandas as pd
import dask.dataframe as dd
df = pd.DataFrame(np.random.randint(100,size=(100000, 20)),columns=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'])
ddf = dd.from_pandas(df, npartitions=10)
ddf.to_parquet('saved_data_prqt', compression='snappy')

但是,由于我的代码,我收到此错误

    ---------------------------------------------------------------------------
ArrowNotImplementedError                  Traceback (most recent call last)
~\anaconda3\lib\site-packages\pyarrow\parquet.py in write_table(table, where, row_group_size, version, use_dictionary, compression, write_statistics, use_deprecated_int96_timestamps, coerce_timestamps, allow_truncated_timestamps, data_page_size, flavor, filesystem, compression_level, use_byte_stream_split, data_page_version, use_compliant_nested_type, **kwargs)

~\anaconda3\lib\site-packages\pyarrow\parquet.py in close(self)
    682             self.is_open = False
    683             if self._metadata_collector is not None:
--> 684                 self._metadata_collector.append(self.writer.metadata)
    685         if self.file_handle is not None:
    686             self.file_handle.close()
.................. it's a long error description which I shortened. If the whole error text required please let me know in the comments section and I'll try to add the full version.

~\anaconda3\lib\site-packages\pyarrow\_parquet.pyx in pyarrow._parquet.ParquetWriter.metadata.__get__()

RuntimeError: file metadata is only available after writer close

有人知道如何调试错误以及错误的原因吗? 谢谢!

【问题讨论】:

您可以尝试将 kwarg engine="fastparquet" 添加到 to.parquet 吗? 您好,苏丹,感谢您的回复。我试过并得到这个错误 AttributeError: module 'numba' has no attribute 'jitclass' 听起来环境内部出了点问题。一种选择是删除环境并从头开始创建一个新环境,最好使用最新版本的软件包。 我在一周前安装了最新的 Anaconda 版本。我还没有创建任何单一的自定义环境。我工作的环境是默认的。 我也喜欢危险的生活,但在环境方面,我学会了为项目创建自定义环境的艰难方法。 【参考方案1】:

我运行了您的确切代码 sn-ps 并且 Parquet 文件的编写没有任何错误。这段代码 sn-p 也可以:

ddf.to_parquet("saved_data_prqt", compression="snappy", engine="pyarrow")

我正在使用 Python 3.9.7、Dask 2021.8.1 和 pyarrow 5.0.0。你用的是什么版本?

这里是 the notebook 我跑了,这里是 the environment 如果你想准确地复制我的计算。

【讨论】:

您好 Powers,感谢您的回复。我试过你的sn-p,但没有成功。我正在使用 Python 3.8.8(默认,2021 年 4 月 13 日,15:08:03)[MSC v.1916 64 位(AMD64)] 和 pyarrow '4.0.1' @Oleg - 你可以试试 Python 3.9 和 PyArrow 5 吗?如果修改版本可以解决问题,那通常是最简单的解决方法 ;) 我使用 Python 3.9.7 和 Pyarrow pyarrow=5.0.0=py39hf9247be_8_cpu 创建了一个环境。当我运行 ddf.to_parquet("saved_data_prqt", compression="snappy") 我得到“AttributeError:模块'numba'没有属性'jitclass'”。如果我添加 engine="pyarrow" 参数,我会得到“RuntimeError: file metadata is only available after writer close” 嘿@Powers,我尝试在另一台安装了 pip 的机器上运行代码,它可以运行。我猜我的 Anaconda 安装出了点问题。感谢您花时间研究它。【参考方案2】:

我通过在 conda 中使用 Python 3.9 和 Pyarrow 5.0 创建一个隔离的虚拟环境,然后在 Jupyter Notebook 中安装相应的 Python 内核来修复该错误。 在 conda 中激活环境然后从 conda 启动 Jupyter Notebook 很重要,否则(出于未知原因)如果我从 Windows 开始菜单打开 Jupyter Notebook,错误仍然存​​在。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于使用 to_parquet() 将 dask 数据帧写入镶木地板结果“RuntimeError:文件元数据仅在写入器关闭后可用”的主要内容,如果未能解决你的问题,请参考以下文章

由于 parquet 文件损坏,Impala 无法创建分区表

pandas to_parquet 在大型数据集上失败

如何将数据读取到 dask 数据帧并删除坏行

使用 Dask 将大于内存的数据帧缓存到本地磁盘

使用 Python 将 Dask 数据帧转换为 Spark 数据帧

dask 如何处理大于内存的数据集