Ошибка Python с использованием pyarrow - ArrowNotImplementedError: поддержка кодека 'snappy' не построена

Использование 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. Идея состоит в том, чтобы написать pandas DataFrame как набор данных Parquet (в Windows) с использованием сжатия Snappy, а затем обработать набор данных Parquet с помощью Spark.

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')

введите описание изображения здесь


person Russell Burdt    schedule 02.02.2021    source источник
comment
Как вы установили pyarrow?   -  person Uwe L. Korn    schedule 03.02.2021
comment
pyarrow был установлен через conda install pyarrow   -  person Russell Burdt    schedule 03.02.2021
comment
Мне не удалось воспроизвести с помощью сборок Windows python 3.8 / 3.9, pypi и conda-forge. Как упоминал Уве в другом месте, snappy должен быть встроен в pyarrow dist на conda. Можете ли вы добавить вывод conda list --export, print(pa.cpp_build_info) и pa.show_versions()?   -  person Pace    schedule 03.02.2021
comment
$ python Python 3.9.1 (по умолчанию, 11 декабря 2020 г., 09:29:25) [MSC v.1916, 64-разрядная версия (AMD64)] :: Anaconda, Inc. на win32. Для получения дополнительной информации введите help, авторские права, кредиты или лицензия. ››› импортировать pyarrow как pa ››› print (pa.cpp_build_info) BuildInfo (version = '3.0.0', version_info = VersionInfo (major = 3, minor = 0, patch = 0), so_version = '300', full_so_version = '300.0.0', compiler_id = 'MSVC', compiler_version = '19 .16.27043.0 ', compiler_flags =' -D_WIN32_WINNT = 0x600 / D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING ', git_id =' ', git_description =')   -  person Russell Burdt    schedule 03.02.2021
comment
››› pa.show_versions () информация о версии pyarrow -------------------- Тип пакета: не указан Arrow Версия библиотеки C ++: 3.0.0 Arrow Компилятор C ++: MSVC 19.16 .27043.0 Стрелка Флаги компилятора C ++: -D_WIN32_WINNT = 0x600 / D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING Стрелка Версия Git C ++: Стрелка Описание git C ++: ›››   -  person Russell Burdt    schedule 03.02.2021
comment
Ваш 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   -  person Pace    schedule 03.02.2021
comment
ОК, это работает, используя conda install -c conda-forge pyarrow вместо conda install pyarrow. Если вы предоставите это в качестве ответа, я могу согласиться. Но почему это так? Потому что в обоих случаях он отображается как pyarrow=3.0.0, поэтому это не было бы ожидаемым поведением.   -  person Russell Burdt    schedule 03.02.2021
comment
Добавил ответ с моей лучшей гипотезой. К сожалению, я просто не уверен. Поскольку pypi_0 просто означает не conda, то оно действительно могло появиться откуда угодно.   -  person Pace    schedule 03.02.2021
comment
Это добавлено в вышестоящую проблему Anaconda github.com/AnacondaRecipes/pyarrow-feedstock/issues/2   -  person Uwe L. Korn    schedule 08.02.2021


Ответы (4)


Установленный вами pyarrow пакет был получен не из conda-forge, и, похоже, он не соответствует пакету на PYPI. Я провел немного больше исследований, и pypi_0 означает, что пакет был установлен через pip. Это не значит, что оно действительно пришло из PYPI.

Я не совсем понимаю, как это произошло. Возможно, вы могли бы проверить свой журнал conda (envs/YOUR-ENV/conda-meta/history), но, учитывая, что он был установлен извне из conda, я не уверен, что там будет какая-либо значимая информация. Возможно, вы пытались установить Arrow после того, как версия была увеличена до 3 и до того, как колеса были загружены, и ваша система вернулась к сборке из исходников?

person Pace    schedule 03.02.2021
comment
Не думайте, что причина в неудачном времени, потому что это было воспроизведено в разные дни. Добавлю, что установка из conda-forge может быть предпочтительнее, чем установка из conda канала по умолчанию, как правило. Эта проблема широко обсуждалась в SO . - person Russell Burdt; 04.02.2021

Что-то не так с методом conda install pyarrow. Я удалил его с помощью conda remove pyarrow, а после этого установил с помощью pip install pyarrow. Это сработало.

person Mitsjol    schedule 30.03.2021
comment
Это сработало и для меня. Быстрое и простое исправление. Установка: Windows 10 x64 с Python 3.8. Локально все работало нормально, но по какой-то причине у меня возникла эта проблема при подключении к удаленному компьютеру с Windows 10 x64 через SSH в командной строке Windows, даже если удаленный путь был на 100% идентичным. - person Contango; 29.04.2021
comment
Спасибо. Я вижу, что с этой даты conda устанавливает 3.0, но pip install 4.0. - person BSalita; 18.05.2021

У меня была такая же проблема. Выполнил новую установку Anaconda 3.8. затем сделал conda install -c conda-forge pyarrow по этой ссылке https://anaconda.org/conda-forge/pyarrow. Он блокирует эту установку, но терпит неудачу из-за замороженного / гибкого решения, и conda продолжает пробовать разные варианты, пока, наконец, не установится. Затем вы можете импортировать pyarrow. Но затем, когда вы пытаетесь открыть файл parquet, вы получаете ошибку кодека «мгновенно» - тема этой темы.

Затем я сделал conda remove pyarrow и вернулся к чистой установке. Затем pip install pyarrow, и я смог успешно загрузить файл паркета.

person clg4    schedule 21.06.2021

Я не на 100%, но это могло быть потому, что с версии 1.0.0 они уменьшили конструкцию стрелок по умолчанию, а snappy стал необязательным компонентом, см.

Я думаю, вам придется перестроить стрелку, используя -DARROW_WITH_SNAPPY=ON, см.. Но это может быть довольно сложно и утомительно, чтобы приступить к работе.

Другой вариант - отключить мгновенно:

pq.write_to_dataset(table, root_path=r'c:/data', partition_cols=['x'], flavor='spark', compression="NONE")
person 0x26res    schedule 03.02.2021
comment
pyarrow был немного уменьшен, но сборки пакетов Python по умолчанию должны по-прежнему включать большинство функций, особенно сжатие Snappy, поскольку это лучший выбор по умолчанию для файлов Parquet. - person Uwe L. Korn; 03.02.2021
comment
даже на винде? - person 0x26res; 03.02.2021
comment
Ошибка действительно появляется в Windows с pyarrow=3.0.0 и с pyarrow=2.0.0. Ошибка не появляется в Windows с pyarrow=1.0.1 и с pyarrow=0.17. Читая примечания к выпуску для pyarrow=2.0.0, я не см. что-нибудь, имеющее отношение к сжатию Snappy, так что это может быть ошибкой. - person Russell Burdt; 03.02.2021
comment
@ 0x26res Быстрое сжатие дает полезные преимущества, и я не рассматриваю отключение как решение в данном случае. - person Russell Burdt; 03.02.2021