2016-06-21 10 views
5

Lavorando con i dataflight Spark importati da Hive, a volte ho finito con diverse colonne che non ho bisogno. Supponendo che io non voglio filtrarli conSeleziona colonne specifiche in un dataframe PySpark per migliorare le prestazioni

df = SqlContext.sql('select cols from mytable') 

e sto importando l'intera tabella con

df = SqlContext.table(mytable) 

fa un select e successiva cache migliora l'utilizzo della memoria prestazioni/diminuzione, come

df = df.select('col_1', 'col_2', 'col_3') 
df.cache() 
df.count() 

o è solo una perdita di tempo? Farò un sacco di operazioni e manipolazioni di dati sul df, come avg, withColumn, ecc

+0

La cache aiuta molto, quindi aumenta le prestazioni. –

+0

Ma vale la pena di fare una selezione in anticipo? – Ivan

+0

Sì, se non hai bisogno di altre colonne nei seguenti passaggi - così avrai solo bisogno di colonne nella cache – MaxU

risposta

1

IMO ha senso per filtrare loro in anticipo:

df = SqlContext.sql('select col_1, col_2, col_3 from mytable') 

in modo da non sprecare risorse ...

Se non è possibile farlo in questo modo, allora si può fare come avete fatto ...

0

E 'certamente una buona pratica, ma è piuttosto improbabile che tradursi in un incremento delle prestazioni a meno che non si tenta di passare i dati thr utilizzare Python RDD o fare qualcosa di simile. Se alcune colonne non sono necessarie per il calcolo, l'ottimizzatore di output dovrebbe automaticamente dedurre le proiezioni e spingerle quanto prima possibile nel piano di esecuzione.

Inoltre vale la pena notare che l'utilizzo di df.count() dopo df.cache() sarà inutile il più delle volte (se non sempre). In generale count viene riscritto dal ottimizzatore come

SELECT SUM(1) FROM table 

così quello che è tipicamente richiesto dalla sorgente è:

SELECT 1 FROM table 

farla breve non v'è nulla di utile per memorizzare nella cache qui.

+0

Grazie ancora, @ zero323! Stavo pensando più alle linee di fare un conteggio solo dopo una cache per impegnare l'operazione di cache e controllare alcuni numeri come sottoprodotto. Ho notato che a volte fare un 'select' rende le prestazioni * peggio * prima della cache. – Ivan

+0

Bene, ragionare sulla cache in Spark SQL è relativamente difficile e trucchi come 'cache' /' count' non sono la migliore idea. È possibile vedere un aumento delle prestazioni non correlato alla memorizzazione nella cache di Spark quando i dati sono ad esempio mappati in memoria ma IMHO è più un rituale che altro. – zero323

Problemi correlati