2017-09-11 1 views
3

J'ai un grand ensemble de données (~ 600 Go) stocké en format HDF5. Comme il est trop grand pour tenir dans la mémoire, je voudrais le convertir au format Parquet et utiliser pySpark pour effectuer un prétraitement de base des données (normalisation, trouver des matrices de corrélation, etc.). Cependant, je ne sais pas comment convertir l'ensemble de données complet en Parquet sans le charger en mémoire.Conversion de HDF5 en Parquet sans chargement en mémoire

J'ai regardé cet aspect: https://gist.github.com/jiffyclub/905bf5e8bf17ec59ab8f#file-hdf_to_parquet-py, mais il semble que tout l'ensemble de données est en cours de lecture en mémoire.

Une chose que je pensais était en train de lire le fichier HDF5 en morceaux et enregistrer que progressivement dans un fichier Parquet:

test_store = pd.HDFStore('/path/to/myHDFfile.h5') 
nrows = test_store.get_storer('df').nrows 
chunksize = N 
for i in range(nrows//chunksize + 1): 
    # convert_to_Parquet() ... 

Mais je ne peux pas trouver toute la documentation qui me permettrait de construire progressivement un parquet fichier. Tous les liens vers d'autres lectures seraient appréciés.

Répondre

5

Vous pouvez utiliser pyarrow pour cela!

import pandas as pd 
import pyarrow as pa 
import pyarrow.parquet as pq 


def convert_hdf5_to_parquet(h5_file, parquet_file, chunksize=100000): 

    stream = pd.read_hdf(h5_file, chunksize=chunksize) 

    for i, chunk in enumerate(stream): 
     print("Chunk {}".format(i)) 

     if i == 0: 
      # Infer schema and open parquet file on first chunk 
      parquet_schema = pa.Table.from_pandas(df=chunk).schema 
      parquet_writer = pq.ParquetWriter(parquet_file, parquet_schema, compression='snappy') 

     table = pa.Table.from_pandas(chunk, schema=parquet_schema) 
     parquet_writer.write_table(table) 

    parquet_writer.close() 
+3

Notez que les jeux de données Parquet sont composés de plusieurs fichiers. Ils n'ont pas besoin de contenir un seul gros fichier, donc l'approche par morceaux est une bonne approche. Il pourrait y avoir 1000 fichiers et c'est bien –