使用 pyarrow 的 Python 错误 - ArrowNotImplementedError:未构建对编解码器“snappy”的支持

Posted

技术标签:

【中文标题】使用 pyarrow 的 Python 错误 - ArrowNotImplementedError:未构建对编解码器“snappy”的支持【英文标题】:Python error using pyarrow - ArrowNotImplementedError: Support for codec 'snappy' not built 【发布时间】:2021-05-07 02:40:44 【问题描述】:

使用 Python、Parquet 和 Spark 并在升级到 pyarrow=3.0.0 后遇到 ArrowNotImplementedError: Support for codec 'snappy' not built。我以前没有此错误的版本是pyarrow=0.17。错误不会出现在pyarrow=1.0.1 中,而确实出现在pyarrow=2.0.0 中。这个想法是使用 Snappy 压缩将 pandas DataFrame 编写为 Parquet 数据集(在 Windows 上),然后使用 Spark 处理 Parquet 数据集。

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.DataFrame(
    'x': [0, 0, 0, 1, 1, 1], 
    'a': np.random.random(6), 
    'b': np.random.random(6))
table = pa.Table.from_pandas(df, preserve_index=False)
pq.write_to_dataset(table, root_path=r'c:/data', partition_cols=['x'], flavor='spark')

【问题讨论】:

你是如何安装pyarrow的? pyarrow 是通过 conda install pyarrow 安装的 我无法使用 Windows python 3.8/3.9 以及 pypi 和 conda-forge 构建进行复制。正如 Uwe 在其他地方提到的,snappy 应该内置到 conda 上的 pyarrow dist 中。你能把conda list --exportprint(pa.cpp_build_info)pa.show_versions()的输出加起来吗? 您的 pyarrow 不是来自 conda-forge。它在conda list 中显示为pyarrow=3.0.0=pypi_0,我认为这意味着它来自pypi。但是,您的 cpp_build_info 也不匹配来自 PYPI 发行版的内容(conda-forge 和 pypi 都使用 MSVC 版本 19.16.27045.0)。卸载 pyarrow 并重新安装,确保从 conda-forge 安装...conda install -c conda-forge pyarrow 将此添加到上游 Anaconda 问题 github.com/AnacondaRecipes/pyarrow-feedstock/issues/2 【参考方案1】:

我通过在 Conda 提示符下执行 pip install pyArrow 设法让它工作。

【讨论】:

【参考方案2】:

我遇到了完全相同的问题。是否全新安装了 Anaconda 3.8。然后从这个链接“https://anaconda.org/conda-forge/pyarrow”做了conda install -c conda-forge pyarrow。它通过此安装而窒息,但因冻结/灵活解决而失败,并且 conda 不断尝试不同的变体,直到最终安装。然后您可以导入 pyarrow。但是,当您尝试打开 parquet 文件时,您会收到“snappy”编解码器错误 - 此线程的主题。

然后我做了conda remove pyarrow,所以我回到了全新安装。然后pip install pyarrow,就可以成功加载parquet文件了。

【讨论】:

【参考方案3】:

conda install pyarrow 方法有问题。我用conda remove pyarrow 删除它,然后用pip install pyarrow 安装它。这最终奏效了。

【讨论】:

这对我也有用。快速简便的修复。设置:Windows 10 x64 和 Python 3.8。在本地一切正常,但由于某种原因,我在通过 SSH 连接到远程 Windows 10 x64 机器时遇到了这个问题,即使远程路径 100% 相同。 谢谢。我看到,截至今天,conda 安装 3.0 但 pip install 4.0。 这也适用于我(使用 Windows 10),但在我的情况下,我在完全按照 Spyder's scientific-computing demo 的说明操作时遇到了同样的错误。感谢您发布此内容。【参考方案4】:

您安装的pyarrow 包不是来自conda-forge,它似乎与PYPI 上的包不匹配。我做了更多的研究,pypi_0 只是意味着软件包是通过pip 安装的。这并不意味着它实际上来自 PYPI。

我不太确定这是怎么发生的。您也许可以检查您的 conda 日志 (envs/YOUR-ENV/conda-meta/history),但鉴于它是从 conda 外部安装的,我不确定其中是否会有任何有意义的信息。也许您尝试在版本升级到 3 之后和***上传之前安装 Arrow,因此您的系统又回到了从源代码构建?

【讨论】:

不要认为原因是不幸的时机,因为它是在不同的日子被复制的。将添加从conda-forge 安装可能比从默认conda 频道安装更可取,通常。那个问题是discussed widely on SO。 好的,我设法通过在 Conda 提示符下执行 pip install pyArrow 来使其工作。 Conda 安装,而 conda forge 安装不起作用。【参考方案5】:

我不是 100%,但这可能是因为从 1.0.0 版本开始,他们精简了默认箭头构建,并且 snappy 成为可选组件,see

我认为你必须使用-DARROW_WITH_SNAPPY=ON、see 重建箭头。但这可能很难开始工作。

另一种选择是禁用snappy:

pq.write_to_dataset(table, root_path=r'c:/data', partition_cols=['x'], flavor='spark', compression="NONE")

【讨论】:

pyarrow 精简了一点,但 Python 包的默认构建仍应包含大部分功能,尤其是 Snappy 压缩,因为这是 Parquet 文件的默认/最佳选择。跨度> 即使在 Windows 上? 该错误确实出现在带有pyarrow=3.0.0pyarrow=2.0.0 的Windows 上。该错误不会出现在带有pyarrow=1.0.1pyarrow=0.17 的Windows 上。阅读pyarrow=2.0.0 的release notes 我没有看到任何引用 Snappy 压缩的内容,所以这可能是一个错误。 @0x26res Snappy 压缩提供了有用的好处,我不认为在这种情况下禁用是一种解决方案。

以上是关于使用 pyarrow 的 Python 错误 - ArrowNotImplementedError:未构建对编解码器“snappy”的支持的主要内容,如果未能解决你的问题,请参考以下文章

无法在 OSX / Python 3.9 上安装 pyarrow:这是我还是不兼容的包?

Python:模块'pyarrow'没有属性'orc'

pyarrow 的构建***失败

错误安装 streamlit 它说“错误:无法为使用 PEP 517 且无法直接安装的 pyarrow 构建***”

pandas_udf 给出与 pyarrow 相关的错误

如何在 python 中使用 pyarrow 从 S3 读取分区镶木地板文件