Python: сохранить фрейм данных pandas в файл паркета

Можно ли сохранить фрейм данных pandas непосредственно в файл паркета? Если нет, то каким будет предлагаемый процесс?

Цель состоит в том, чтобы иметь возможность отправить файл паркета другой команде, которая может использовать код Scala для его чтения/открытия. Спасибо!


person Edamame    schedule 09.12.2016    source источник
comment
Другая команда использует Spark или другие инструменты Scala? Загрузка CSV в Spark довольно тривиальна   -  person evan.oman    schedule 09.12.2016
comment
Если у вас есть pyspark, вы можете сделать что-то вроде это   -  person evan.oman    schedule 09.12.2016


Ответы (6)


Pandas имеет основную функцию to_parquet(). Просто запишите кадр данных в формат паркета следующим образом:

df.to_parquet('myfile.parquet')

Вам все еще нужно установить паркетную библиотеку, такую ​​как fastparquet. Если у вас установлено более одной библиотеки паркета, вам также необходимо указать, какой движок вы хотите использовать в пандах, иначе потребуется установить первую (как в файле документация). Например:

df.to_parquet('myfile.parquet', engine='fastparquet')
person ben26941    schedule 10.03.2018
comment
Запустив это в Databricks 7.1 (python 3.7.5), я получаю объект DataFrame не имеет атрибута 'toParquet' - person Nick.McDermaid; 20.08.2020
comment
Что ж, это вроде бы легко: нет toParquet, нет. Это to_parquet. Ваше здоровье! pandas.pydata.org/pandas-docs/ стабильный/ссылка/API/ - person ben26941; 21.08.2020

Да, pandas поддерживает сохранение фрейма данных в формате паркета.

Простой способ записать кадр данных pandas в паркет.

Предполагая, что df - это кадр данных pandas. Нам нужно импортировать следующие библиотеки.

import pyarrow as pa
import pyarrow.parquet as pq

Сначала запишите кадр данных df в таблицу pyarrow.

# Convert DataFrame to Apache Arrow Table
table = pa.Table.from_pandas(df_image_0)

Во-вторых, запишите table в файл parquet, скажем, file_name.parquet

# Parquet with Brotli compression
pq.write_table(table, 'file_name.parquet')

ПРИМЕЧАНИЕ: файлы паркета могут быть дополнительно сжаты при записи. Ниже приведены популярные форматы сжатия.

  • Snappy (по умолчанию, не требует аргументов)
  • gzip
  • Бротли

Паркет с компрессией Snappy

 pq.write_table(table, 'file_name.parquet')

Паркет со сжатием GZIP

pq.write_table(table, 'file_name.parquet', compression='GZIP')

Паркет с компрессией Brotli

pq.write_table(table, 'file_name.parquet', compression='BROTLI')

Сравнительное сравнение с разными форматами паркета

введите здесь описание изображения

Ссылка: https://tech.blueyonder.com/efficient-dataframe-storage-with-apache-parquet/

person DataFramed    schedule 31.12.2019

Существует относительно ранняя реализация пакета под названием fastparquet — это может быть хорошим вариантом использования для того, что вам нужно.

https://github.com/dask/fastparquet

conda install -c conda-forge fastparquet

or

pip install fastparquet

from fastparquet import write 
write('outfile.parq', df)

или, если вы хотите использовать некоторые параметры файла, такие как группировка/сжатие строк:

write('outfile2.parq', df, row_group_offsets=[0, 10000, 20000], compression='GZIP', file_scheme='hive')
person Mark S    schedule 17.02.2017

Да, это возможно. Вот пример кода:

import pyarrow as pa
import pyarrow.parquet as pq

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
table = pa.Table.from_pandas(df, preserve_index=True)
pq.write_table(table, 'output.parquet')
person Lionel    schedule 04.10.2018

pyarrow поддерживает хранение фреймов данных pandas:

import pyarrow

pyarrow.Table.from_pandas(dataset)
person hangc    schedule 20.11.2017

это подход, который сработал для меня - аналогичный приведенному выше, но также решил указать тип сжатия:

import pandas as pd 

настроить тестовый фрейм данных

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})

импортировать необходимую библиотеку паркета (убедитесь, что она установлена, я использовал: $ conda install fastparquet)

import fastparquet

преобразовать фрейм данных в паркет и сохранить в текущем каталоге

df.to_parquet('df.parquet.gzip', compression='gzip')

прочитать файл паркета в текущем каталоге обратно в фрейм данных pandas

pd.read_parquet('df.parquet.gzip')

выход:

    col1    col2
0    1       3
1    2       4
person Grant Shannon    schedule 02.10.2018
comment
Зачем нам импорт, если мы ничего из него не используем? - person MattSom; 18.05.2020