问题描述
使用 Python、Parquet 和 Spark 并在升级到 ArrowNotImplementedError: Support for codec 'snappy' not built
后运行到 pyarrow=3.0.0
。我以前没有这个错误的版本是 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,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
软件包不是来自 conda-forge
,它似乎与 PYPI
上的软件包不匹配。我做了更多的研究,pypi_0
只是表示该软件包是通过 pip
安装的。这并不意味着它实际上来自 PYPI。
我不确定这是怎么发生的。您可以检查您的 conda 日志 (envs/YOUR-ENV/conda-meta/history
) 但是,鉴于这是从 conda 外部安装的,我不确定其中是否会有任何有意义的信息。也许您在版本升级到 3 之后和上传轮子之前尝试安装 Arrow,因此您的系统退回到从源代码构建?
conda install pyarrow
方法有问题。我用 conda remove pyarrow
删除它,然后用 pip install pyarrow
安装它。这最终奏效了。
我遇到了完全相同的问题。重新安装了 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
,我可以成功加载镶木地板文件。
我不是 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")