Методы написания паркетных файлов с помощью Python?

у меня возникли проблемы с поиском библиотеки, которая позволяет писать паркетные файлы с помощью Python. Бонусные баллы, если я могу использовать Snappy или аналогичный механизм сжатия в сочетании с ним.

до сих пор единственным методом, который я нашел, является использование Spark с pyspark.sql.DataFrame поддержка паркетный.

у меня есть несколько скриптов, которые должны писать паркетные файлы, которые не являются заданиями Spark. Есть ли какой-либо подход к написанию паркетных файлов в Python, который не включает pyspark.sql?

3 ответов


Обновление (Март 2017): В настоящее время 2 библиотеки способны писать паркетный файлы:

  1. fastparquet
  2. pyarrow

оба они все еще находятся в тяжелом развитии, кажется, и они поставляются с рядом отказов (без поддержки вложенных данных, например), поэтому вам придется проверить, поддерживают ли они все, что вам нужно.

старый Ответ:

по состоянию на 2.2016, похоже, нет библиотеки только для python, способной писать файлы паркет.

Если вам нужны только читать паркетные файлы есть python-паркет.

в качестве обходного пути вам придется полагаться на какой-то другой процесс, например pyspark.sql (который использует Py4J и работает на JVM и, следовательно, не может использоваться непосредственно из вашей средней программы CPython).


fastparquet есть поддержка записи, вот фрагмент для записи данных в файл

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

используя fastparquet вы можете написать панд df паркет либо сsnappy или gzip сжатие следующим образом:

убедитесь, что вы установили следующее:

$ conda install python-snappy
$ conda install fastparquet

do imports

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