Способы записи файлов Parquet с использованием Python?
У меня возникли проблемы с поиском библиотеки, которая позволяет писать файлы Parquet с использованием Python. Бонусные очки, если я могу использовать Snappy или аналогичный механизм сжатия в сочетании с ним.
До сих пор единственным методом, который я нашел, является использование Spark с поддержкой pyspark.sql.DataFrame
Parquet.
У меня есть некоторые скрипты, которые должны писать файлы Parquet, которые не являются заданиями Spark. Есть ли подход к написанию файлов Parquet в Python, который не включает pyspark.sql
?
Ответы
Ответ 1
Обновление (март 2017): В настоящее время существуют 2 библиотеки, способные писать файлы Parquet:
Оба из них по-прежнему находятся в тяжелом развитии, и они приходят с несколькими отказами (без поддержки вложенных данных, например), поэтому вам нужно будет проверить, поддерживают ли они все, что вам нужно.
СТАРЫЙ ОТВЕТ:
По состоянию на 2.2016, похоже, нет библиотеки, содержащей только python, которая может писать файлы Parquet.
Если вам нужны только файлы Parquet, python-паркет.
В качестве обходного пути вам придется полагаться на какой-то другой процесс, например, pyspark.sql
(который использует Py4J и запускается на JVM и поэтому не может использоваться непосредственно из вашей средней программы CPython).
Ответ 2
FastParquet имеет поддержку записи, вот фрагмент для записи данных в файл
from fastparquet import write
write('outfile.parq', df)
Ответ 3
с помощью fastparquet
вы можете написать панд df
на паркет либо с snappy
или gzip
сжатия следующим образом:
убедитесь, что вы установили следующее:
$ conda install python-snappy
$ conda install fastparquet
делать импорт
import pandas as pd
import snappy
import fastparquet
Предположим, у вас есть следующие панды df
df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
отправить df
на паркет с snappy
сжатием
df.to_parquet('df.snap.parquet',compression='snappy')
отправить df
на паркет со сжатием gzip
df.to_parquet('df.gzip.parquet',compression='gzip')
проверять:
прочитать паркет обратно в панд df
pd.read_parquet('df.snap.parquet')
или же
pd.read_parquet('df.gzip.parquet')
выход:
col1 col2
0 1 3
1 2 4