Dask df.to_parquet не может найти pyarrow. Ошибка выполнения: `pyarrow` не установлен

#python #dask #parquet

#python #dask #паркет

Вопрос:

Окружающая среда:

  • macOS Big Sur v 11.6.1
  • Python 3.7.7
  • pyarrow==5.0.0 (из pipfreeze)

Из терминала:

 >>> import pyarrow
>>> pyarrow
<module 'pyarrow' from '/Users/garyb/Develop/DS/tools-pay-data-pipeline/env/lib/python3.7/site-packages/pyarrow/__init__.py'
 

Итак, я подтвердил, что у меня установлен pyarrow. Но когда я пытаюсь записать фрейм данных Dask в parquet, я получаю:

 def make_parquet_file(filepath):
    parquet_path = f'{PARQUET_DIR}/{company}_{table}_{batch}.parquet'
    df.to_parquet(parquet_path, engine='pyarrow')
 

ModuleNotFoundError: No module named pyarrow

Подробная информация об исключении:

 ~/Develop/DS/research-dask-parquet/env/lib/python3.7/site-packages/dask/dataframe/io/parquet/core.py in get_engine(engine)
    970     elif engine in ("pyarrow", "arrow", "pyarrow-legacy", "pyarrow-dataset"):
    971 
--> 972         pa = import_required("pyarrow", "`pyarrow` not installed")
    973         pa_version = parse_version(pa.__version__)
    974 
 

Эта функция работает. Это гораздо меньший csv-файл, просто чтобы подтвердить, что функция df.to_parquet работает:

 def make_parquet_file():
    csv_file = f'{CSV_DATA_DIR}/diabetes.csv'
    parquet_file = f'{PARQUET_DIR}/diabetes.parquet'

    # Just to prove I can read the csv file
    p_df = pd.read_csv(csv_file)
    print(p_df.shape)

    d_df = dd.read_csv(csv_file)
    d_df.to_parquet(parquet_file)
 

Он ищет пакет в нужном месте? Я застрял

Ответ №1:

Похоже, что dask и чистый python используют разные среды.

В первом примере путь:

~/Develop/DS/tools-pay-data-pipeline/env/lib/python3.7

В обратной трассировке путь:

~/Develop/DS/research-dask-parquet/env/lib/python3.7

Итак, быстрое решение — установить pyarrow во второй среде. Другое исправление заключается в установке пакетов на рабочих (это может помочь).

Более надежным решением является использование файлов среды.

Комментарии:

1. Спасибо, Султан, ты уловил то, что я пропустил, потому что я никогда раньше не сталкивался с подобной проблемой. Примечание: у меня есть виртуальные среды для каждого проекта. И PyArrow установлен в обеих средах tools-pay-data-pipeline и research-dask-parquet . Но большая проблема в том, почему он ищет пакет в неправильной среде? Обратите внимание, что имя папки виртуальной среды — «env» в обоих проектах. У меня есть пара идей, и я проведу расследование. Я сообщу о результатах.

2. Спасибо, GDB, любопытно узнать, почему это произошло!

3. Хорошо, проблема решена — возможно. Во время экспериментов с разработкой я использую Jupyter для тестирования и отладки. Позже все функции перемещаются в скрипты, которые затем импортируются в записную книжку. Тогда роль записной книжки — демонстрация и документ, то есть лучшая альтернатива командной строке для демонстрации. В этом случае я все еще нахожусь в режиме эксперимента. Итак, проблема заключалась в ядре Jupyter. Я удалил тот, который использовался, и создал новый. Затем PyArrow был извлечен из правильной виртуальной среды и работал, как ожидалось.

4. Ах, хорошо. На всякий случай, если вы этого не видели, nbdev предполагается, что это поможет в этом сценарии, сохраняя весь код в записных книжках (FWIW мне не удалось начать использовать nbdev на ежедневной основе).

Ответ №2:

Хорошо, проблема решена — возможно. Во время разработки и экспериментов я использую Jupyter для тестирования и отладки. Позже все функции перемещаются в скрипты, которые затем могут быть импортированы в любой ноутбук, который в них нуждается. Роль ноутбука на этом этапе в этом проекте — демонстрация и документ, то есть лучшая альтернатива командной строке для демонстрации.

В этом случае я все еще нахожусь в режиме эксперимента. Итак, проблема заключалась в ядре Jupyter. Я случайно переработал имя, и виртуальная среда в двух проектах также имеет одно и то же имя — «env». Видите шаблон здесь? Ленивый укусил меня.

Я удалил используемое ядро и создал новое с уникальным именем. Затем PyArrow был извлечен из правильной виртуальной среды и работал, как ожидалось.