Управление схемой с использованием библиотеки 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