Сохранение Pandas Dataframe в паркет по частям: схема таблицы не соответствует файлу - PullRequest
0 голосов
/ 01 марта 2019

Имея огромный 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 имеет другой тип, хотя я заставляю его быть объектом.По-видимому, это связано с тем, что отсутствует весь столбец, а паркет просто игнорирует ранее переданные типы.

Вопрос :

Почему это происходит?Как я могу преодолеть несоответствие типов данных?

Я думал, что смогу втиснуть первую строку отсутствующего столбца с помощью кусков, но это просто неаккуратное исправление.Есть ли лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...