Я пишу файл паркета из Spark DataFrame следующим образом:
df.write.parquet("path/myfile.parquet", mode = "overwrite", compression="gzip")
Это создает папку с несколькими файлами в нем.
Когда я пытаюсь прочитать это в pandas, я получаю следующие ошибки, в зависимости от того, какой парсер я использую:
import pandas as pd
df = pd.read_parquet("path/myfile.parquet", engine="pyarrow")
PyArrow:
Файл "pyarrow\error.pxi", строка 83, в pyarrow.lib.check_status
ArrowIOError: Неверный файл паркета. Коррумпированный нижний колонтитул.
fastparquet:
Файл "C:\Program Files\Anaconda3\lib\site-packages\fastparquet\util.py", строка 38, в default_open возвращает open (режим f)
PermissionError: [Errno 13] Отказано в доступе: 'путь/myfile.parquet'
Я использую следующие версии:
Я пробовал gzip так же быстро, как сжатие. Оба не работают. Я, конечно, убедился, что у меня есть файл в месте, где у Python есть права на чтение/запись.
Это уже помогло бы, если бы кто-то смог воспроизвести эту ошибку.
Проблема в том, что Spark разбивает файл на части из-за его распределенной природы (каждый исполнитель записывает файл в каталог, который получает имя файла). Это не то, что поддерживается Pandas, который ожидает файл, а не путь.
Вы можете обойти эту проблему по-разному:
Чтение файла с помощью альтернативной утилиты, такой как pyarrow.parquet.ParquetDataset
, а затем преобразование этого в Pandas (я не тестировал этот код).
arrow_df = pyarrow.parquet.ParquetDataset('path/myfile.parquet')
pandas_df = arrow_df.to_pandas()
Другой способ - прочитать отдельные фрагменты по отдельности, а затем объединить их, как следует из этого ответа: прочитать несколько файлов паркета в папке и записать в один файл csv, используя python