игнорировать столбцы, отсутствующие в паркете, с пиарроу в пандах

Пытаюсь прочитать паркет с pyarrow==1.0.1 в качестве двигателя.

Данный :

columns = ['a','b','c']    
pd.read_parquet(x, columns=columns, engine="pyarrow")

если файл x не содержит c, он выдаст:

/opt/anaconda3/.../lib/python3.6/site-packages/pyarrow/_dataset.pyx in pyarrow._dataset.Dataset.to_table()

/opt/anaconda3/.../lib/python3.6/site-packages/pyarrow/_dataset.pyx in pyarrow._dataset.Dataset._scanner()

    /opt/anaconda3/.../lib/python3.6/site-packages/pyarrow/_dataset.pyx in pyarrow._dataset.Scanner.from_dataset()
    
    /opt/anaconda3/.../lib/python3.6/site-packages/pyarrow/_dataset.pyx in pyarrow._dataset._populate_builder()
    
    /opt/anaconda3/.../lib/python3.6/site-packages/pyarrow/error.pxi in pyarrow.lib.check_status()
    
    ArrowInvalid: Field named 'c' not found or not unique in the schema.

Нет аргументов, чтобы игнорировать предупреждение и просто читать столбцы, которые отсутствуют как nan.

Обработка ошибок тоже довольно плохая.

pyarrow.lib.ArrowInvalid("Field named 'c' not found or not unique in the schema.")

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

Есть ли способ для этого?


person kada    schedule 13.01.2021    source источник


Ответы (1)


Вы можете прочитать метаданные из файла паркета, чтобы выяснить, какие столбцы доступны.

Однако имейте в виду, что панды не смогут угадать тип отсутствующего столбца (c в приведенном ниже примере), что может вызвать проблемы при объединении таблиц позже.

import pandas as pd
import pyarrow.parquet as pq

all_columns = ['a', 'b', 'c']

df = pd.DataFrame({'a': [1, 2, 3], 'b': ['foo', 'bar', 'z']})
file_name = '/tmp/my_df.pq'
df.to_parquet(file_name)

parquet_file = pq.ParquetFile(file_name)
columns_in_file = [c for c in all_columns if c in parquet_file.schema.names]
df = (
    parquet_file
        .read(columns=columns_in_file)
        .to_pandas()
        .reindex(columns=all_columns)
)
person 0x26res    schedule 13.01.2021
comment
спасибо, это решение, которое я тоже использовал в данный момент. но ваше решение немного оптимизировано. - person kada; 14.01.2021