Имея огромный SAS-файл, я хотел бы преобразовать его в паркет, сохраняя определенные типы данных, указанные в словаре pq_types
.
Код выглядит следующим образом:
def parquet_exporter(df, path=None, writer=None):
table = pa.Table.from_pandas(df)
if writer is None:
writer = pq.ParquetWriter(path, table.schema)
writer.write_table(table=table)
return writer
# Create references
input_file = './input/facs_tot2.sas7bdat'
export_pq = './output/extra.parquet'
writer = None
# Create types dictionary for the DataFrame
pq_types= {
'id_saspsm': 'float64',
...
'brand': 'object',
}
# Read SAS file
df = pd.read_sas(input_file, chunksize=my_chunk, iterator=True, format='sas7bdat', encoding='iso-8859-1' )
# Export it to paquet
for chunk in df:
new = chunk.astype(pq_types)
writer = parquet_exporter(new, export_pq, writer)
Запускается как положено, экспортирует несколько чанков, но в определенный момент времени происходит сбой из-за несоответствия между типами данных (чанк против уже экспортированного)
ValueError: Table schema does not match the schema used to create file:
table:
id_saspsm: double
...
brand: null
file:
id_saspsm: double
...
brand: string
Как вы можете видеть brand имеет другой тип, хотя я заставляю его быть объектом.По-видимому, это связано с тем, что отсутствует весь столбец, а паркет просто игнорирует ранее переданные типы.
Вопрос :
Почему это происходит?Как я могу преодолеть несоответствие типов данных?
Я думал, что смогу втиснуть первую строку отсутствующего столбца с помощью кусков, но это просто неаккуратное исправление.Есть ли лучший способ сделать это?