Wie lese ich eine Parkettdatei in Pandas DataFrame?

76

Wie kann man einen Parkett-Datensatz von bescheidener Größe in einen speicherinternen Pandas DataFrame lesen, ohne eine Cluster-Computing-Infrastruktur wie Hadoop oder Spark einzurichten? Dies ist nur eine mäßige Datenmenge, die ich mit einem einfachen Python-Skript auf einem Laptop im Speicher lesen möchte. Die Daten befinden sich nicht in HDFS. Es befindet sich entweder im lokalen Dateisystem oder möglicherweise in S3. Ich möchte keine anderen Dienste wie Hadoop, Hive oder Spark starten und konfigurieren.

Ich dachte, Blaze / Odo hätte dies möglich gemacht: In der Odo-Dokumentation wird Parkett erwähnt, aber die Beispiele scheinen alle eine externe Hive-Laufzeit zu durchlaufen.

Daniel Mahler
quelle
3
Haben Sie die Daten zufällig offen verfügbar? Mein Zweig von Python-Parkett github.com/martindurant/parquet-python/tree/py3 hatte einen Pandas-Leser in parquet.rparquet, Sie könnten es versuchen. Es gibt viele Parkettkonstrukte, mit denen es nicht umgehen kann.
mdurant
4
Warten Sie auf das Apache Arrow-Projekt, an dem der Pandas-Autor Wes Mckinney beteiligt ist. wesmckinney.com/blog/pandas-and-apache-arrow Nachdem dies erledigt ist, sollten Benutzer in der Lage sein, die Parkettdatei direkt von Pandas einzulesen.
XValidated
4
Da die Frage als Off-Topic geschlossen ist (aber immer noch das erste Ergebnis bei Google), muss ich sie in einem Kommentar beantworten. Sie können jetzt mit Pyarrow eine Parkettdatei lesen und in einen Pandas-DataFrame konvertieren:import pyarrow.parquet as pq; df = pq.read_table('dataset.parq').to_pandas()
sroecker
4
Ein bisschen genervt, dass diese Frage geschlossen wurde. Funken und Parkett sind (noch) relativ schlecht dokumentiert. Bin auch auf der Suche nach der Antwort darauf.
user48956
2
Sowohl die Fastparquet- als auch die Pyarrow-Bibliothek ermöglichen das Einlesen einer Parkettdatei in einen Pandas-Datenrahmen: github.com/dask/fastparquet und arrow.apache.org/docs/python/parquet.html
ogrisel

Antworten:

96

pandas 0.21 führt neue Funktionen für Parkett ein :

pd.read_parquet('example_pa.parquet', engine='pyarrow')

oder

pd.read_parquet('example_fp.parquet', engine='fastparquet')

Der obige Link erklärt:

Diese Engines sind sehr ähnlich und sollten nahezu identische Dateien im Parkettformat lesen / schreiben. Diese Bibliotheken unterscheiden sich durch unterschiedliche zugrunde liegende Abhängigkeiten (Fastparquet unter Verwendung von Numba, während Pyarrow eine C-Bibliothek verwendet).

Chrisaycock
quelle
9
Für die meisten meiner Daten ist 'Fastparquet' etwas schneller. Nur für den Fall, dass pd.read_parquet()ein Problem mit dem Snappy-Fehler auftritt, führen Sie es aus conda install python-snappy, um snappy zu installieren.
Catbuilts
Ich fand Pyarrow zu schwierig zu installieren (sowohl auf meinem lokalen Windows-Computer als auch auf einem Cloud-Linux-Computer). Auch nach dem Python-Snappy-Fix ​​gab es zusätzliche Probleme mit dem Compiler sowie das Fehlermodul 'pyarrow' hat kein Attribut 'kompatibel'. Fastparquet hatte überhaupt keine Probleme.
Seb
1
@Catbuilts Sie können gzip verwenden, wenn Sie nicht bissig sind.
Khan
19

Update: Seit ich darauf geantwortet habe, wurde viel an diesem Blick auf Apache Arrow gearbeitet, um Parkett besser lesen und schreiben zu können. Außerdem: http://wesmckinney.com/blog/python-parquet-multithreading/

Es gibt einen Python-Parkettleser, der relativ gut funktioniert: https://github.com/jcrobak/parquet-python

Es werden Python-Objekte erstellt, und dann müssen Sie sie in einen Pandas-Datenrahmen verschieben, damit der Prozess langsamer als pd.read_csvbeispielsweise ist.

danielfrg
quelle
9
Tatsächlich gibt es Pyarrow, der beide Lese- / Schreibvorgänge zulässt
bluszcz
Ich erhalte einen Fehler, bei dem die Berechtigung verweigert wurde, wenn ich versuche, Ihrem Link @bluszcz zu folgen. Haben Sie eine Alternative?
snooze_bear
1
Parkett-Python ist viel langsamer als Alternativen wie Fastparquet und Pyarrow: Pfeil.apache.org/docs/python/parquet.html
Ogrisel
1
pd.read_parquetist jetzt Teil von Pandas. Die andere Antwort sollte als gültig markiert sein.
Ogrisel
7

Neben Pandas bietet Apache Pyarrow auch die Möglichkeit, Parkett in Datenrahmen umzuwandeln

Der Code ist einfach, geben Sie einfach Folgendes ein:

import pyarrow.parquet as pq

df = pq.read_table(source=your_file_path).to_pandas()

Weitere Informationen finden Sie im Dokument von Apache pyarrow zum Lesen und Schreiben einzelner Dateien

WY Hsu
quelle