Управление схемой с использованием библиотеки Fastparquet

Я делю большой файл данных (~10 ГБ) на несколько частей и создаю из них файлы паркета с помощью библиотеки fastparquet. Я привожу типы столбцов, используя атрибут object_encoding на основе словаря столбцов, который определяет столбцы как числовые или не числовые (префикс F для числовых, а остальные не числовые).

Основываясь на документации API для fastparquet, я понимаю, что object_encoding применяется только к столбцам объекта, но я создал отображение типов данных для всех столбцов в кадре данных (см. Ниже переменную pfschema):

pfschema = { k: "int" if v[0] == 'F' else "bytes" for k, v in col.items() }

Затем я перебираю порции записей и создаю файл партера в цикле for (см. Содержание цикла ниже)

df = pd.DataFrame(records)
df.to_parquet(filepath + 'pq/data.parquet', object_encoding=pfschema, engine='fastparquet', compression='GZIP')

Как только файлы сгенерированы, я пытаюсь прочитать их вместе, но сначала я генерирую метаданные для них, используя нижеприведенное.

filelist = glob.glob(filepath + '/*.parquet')
fp.writer.merge(filelist)

Однако в процессе генерации метаданных я вижу ошибку несовместимых схем (см. Ниже), поскольку записанные файлы паркета имеют определенные переменные разных типов. Наиболее примечательно, что DOUBLE в некоторых файлах - это INT64 в других. Можно ли получить полный контроль над конечной схемой во время операций записи и в идеале иметь возможность установить схему (аналогично тому, как библиотека pyarrow использует атрибут схемы?) Для всех столбцов, а не только для столбцов объекта? Я думаю, что в fasparquet атрибут схемы только для чтения? Любая помощь приветствуется.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-6c5dde5d7c34> in <module>()
     10 filelist = glob.glob(filepath + '/*.parquet')
---> 11 fp.writer.merge(filelist)

C:\Software\Anaconda3\lib\site-packages\fastparquet\writer.py in merge(file_list, verify_schema, open_with, root)
   1022     """
   1023     basepath, fmd = metadata_from_many(file_list, verify_schema, open_with,
-> 1024                                        root=root)
   1025 
   1026     out_file = join_path(basepath, '_metadata')

C:\Software\Anaconda3\lib\site-packages\fastparquet\util.py in metadata_from_many(file_list, verify_schema, open_with, root)
    135         for pf in pfs[1:]:
    136             if pf._schema != pfs[0]._schema:
--> 137                 raise ValueError('Incompatible schemas')
    138 
    139     fmd = copy.copy(pfs[0].fmd)  # we inherit "created by" field

ValueError: Incompatible schemas

0 ответов

Другие вопросы по тегам