2017-09-22 1 views
2

Ich muss dasask verwenden, um mehrere Parkett-Dateien mit identischem Schema in einen einzigen Datenrahmen zu laden. Dies funktioniert, wenn sie sich alle im selben Verzeichnis befinden, aber nicht in separaten Verzeichnissen.So lesen Sie mehrere Parkett-Dateien (mit demselben Schema) aus mehreren Verzeichnissen mit demask/fastparquet

Zum Beispiel:

import fastparquet 
pfile = fastparquet.ParquetFile(['data/data1.parq', 'data/data2.parq']) 

funktioniert gut, aber wenn ich data2.parq in ein anderes Verzeichnis zu kopieren, das folgende nicht funktioniert:

pfile = fastparquet.ParquetFile(['data/data1.parq', 'data2/data2.parq']) 

Die Zurückverfolgungs erhalte ich die folgende ist:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-11-b3d381f14edc> in <module>() 
----> 1 pfile = fastparquet.ParquetFile(['data/data1.parq', 'data2/data2.parq']) 

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/api.py in __init__(self, fn, verify, open_with, sep) 
    82   if isinstance(fn, (tuple, list)): 
    83    basepath, fmd = metadata_from_many(fn, verify_schema=verify, 
---> 84            open_with=open_with) 
    85    self.fn = sep.join([basepath, '_metadata']) # effective file 
    86    self.fmd = fmd 

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/util.py in metadata_from_many(file_list, verify_schema, open_with) 
    164  else: 
    165   raise ValueError("Merge requires all PaquetFile instances or none") 
--> 166  basepath, file_list = analyse_paths(file_list, sep) 
    167 
    168  if verify_schema: 

~/anaconda/envs/hv/lib/python3.6/site-packages/fastparquet/util.py in analyse_paths(file_list, sep) 
    221  if len({tuple([p.split('=')[0] for p in parts[l:-1]]) 
    222    for parts in path_parts_list}) > 1: 
--> 223   raise ValueError('Partitioning directories do not agree') 
    224  for path_parts in path_parts_list: 
    225   for path_part in path_parts[l:-1]: 

ValueError: Partitioning directories do not agree 

Ich bekomme den gleichen Fehler bei der Verwendung dask.dataframe.read_parquet, die Ich nehme an, verwendet das gleiche Objekt ParquetFile.

Wie kann ich mehrere Dateien aus verschiedenen Verzeichnissen laden? Es ist keine Option, alle Dateien in das gleiche Verzeichnis zu laden.

Antwort

3

Dies funktioniert in fastparquet auf Master, wenn entweder absolute Pfade oder explizite Verwendung von relativen Pfaden:

pfile = fastparquet.ParquetFile(['./data/data1.parq', './data2/data2.parq']) 

Die Notwendigkeit der führenden ./ sollte ein Fehler in Betracht gezogen werden - das Problem sehen.

2

Eine Problemumgehung wäre, jeden Block separat zu lesen und an dask.dataframe.from_delayed weiterzugeben. Dies tut nicht genau die gleiche Metadatenbehandlung, die read_parquet tut (unter 'index' sollte der Index sein), aber sonst sollte funktionieren.

import dask.dataframe as dd  
from dask import delayed  
from fastparquet import ParquetFile 

@delayed 
def load_chunk(pth): 
    return ParquetFile(pth).to_pandas() 

files = ['temp/part.0.parquet', 'temp2/part.1.parquet'] 
df = dd.from_delayed([load_chunk(f) for f in files]) 

df.compute() 
Out[38]: 
    index a 
0  0 1 
1  1 2 
0  2 3 
1  3 4 
+0

github Ausgabe - https://github.com/dask/fastparquet/issues/217 – chrisb

Verwandte Themen