#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 был извлечен из правильной виртуальной среды и работал, как ожидалось.