2015-04-22 15 views
8

Sto caricando file di parquet ad alta dimensionalità ma ho bisogno solo di poche colonne. Il mio codice attuale assomiglia:Come caricare in modo efficiente file di Parquet in Spark (pySpark v1.2.0)

dat = sqc.parquetFile(path) \ 
      .filter(lambda r: len(r.a)>0) \ 
      .map(lambda r: (r.a, r.b, r.c)) 

Il mio modello mentale di ciò che sta accadendo è che si sta caricando tutti i dati, quindi buttare fuori le colonne che non voglio. Ovviamente preferirei che non legga nemmeno quelle colonne e da quello che capisco sul parquet sembra possibile.

Quindi ci sono due domande:

  1. è il mio modello mentale sbagliato? Oppure il compilatore di scintille è abbastanza intelligente da leggere solo nelle colonne a, b e c nell'esempio sopra?
  2. Come posso forzare sqc.parquetFile() a leggere i dati in modo più efficiente?
+0

penso che le possibilità per ottenere leggere solo le colonne necessarie sarà più alto se si 'map' _prima_' filter' – sds

risposta

0

Spark fa sempre le cose in modo pigro, utilizzando una funzione di scala nativa. Il codice scala è già compilato e rende le runtime intelligenti, intendo le decisioni pigre. Con il parquet, dovrebbe solo leggere i dati necessari, a cui fa riferimento il codice. Ovviamente ciò dipende dalla struttura del particolare file parquet. Il punto è che sfrutterà il formato colonnare. Non ne so abbastanza su Python, ma dovrebbe essere in grado di fare la stessa cosa. Forse controlla se la classe pyspark Row utilizza una sorta di magia pigra. Un modo rapido per verificare è fare un esperimento controllato, scrivere un'altra operazione rdd che faccia riferimento a più campi, ma non li rilascia. Quindi è possibile confrontare la differenza di tempo dell'orologio a muro tra le 2 operazioni. A seconda di alcuni dettagli rilevanti del file di parquet sottostante, è possibile che la differenza non venga rilevata anche se il caricamento è lazy.

0

campi Si sarà solo selezionati dal disco.

"apre tutti i file di dati, ma legge solo la parte di ciascun file contenente i valori per quella colonna.I valori di colonna vengono archiviati consecutivamente, riducendo al minimo l'I/O necessario per elaborare i valori all'interno di una singola colonna."

La documentazione per impala, penso che la lettura logica è la stessa scintilla troppo http://www.cloudera.com/documentation/archive/impala/2-x/2-1-x/topics/impala_parquet.html#parquet_data_files_unique_1