2015-03-03 17 views
11

Sto provando a filtrare la funzione della mappa interna. Fondamentalmente il modo in cui lo farò nella classica mappa-reduce è che il mapper non scriverà nulla al contesto quando i criteri di filtro si incontrano. Come posso ottenere risultati simili con la scintilla? Non riesco a restituire null dalla funzione map in quanto non riesce nel passaggio shuffle. Posso usare la funzione filtro ma sembra un'iterazione inutile del set di dati mentre posso eseguire lo stesso compito durante la mappa. Posso anche provare a generare null con la chiave dummy ma questo è un pessimo rimedio.spark - filter all'interno della mappa

+0

potresti aggiungere codice di esempio che illustra il problema? – maasg

risposta

13

ci sono poche opzioni:

rdd.flatMap: rdd.flatMap si appiattisce una collezione Traversable nella RDD. Per scegliere gli elementi, in genere viene restituito un valore Option come risultato della trasformazione.

rdd.flatMap(elem => if (filter(elem)) Some(f(elem)) else None) 

rdd.collect(pf: PartialFunction) consente di fornire una funzione parziale che può filtrare e trasformare elementi dall'originale RDD. Puoi utilizzare tutta la potenza della corrispondenza del modello con questo metodo.

rdd.collect{case t if (cond(t)) => f(t)} 
rdd.collect{case t:GivenType => f(t)} 

Come Dean Wampler menziona nei commenti, rdd.map(f(_)).filter(cond(_)) potrebbe essere buono e ancora più veloce rispetto alle altre opzioni piu 'terse' di cui sopra.

Dove f è una funzione di trasformazione (o mappa).

+3

Se si utilizza '... filter(). Map()', verranno eseguiti nello stesso task per ogni partizione, analogamente al concatenamento di "mapper" in MapReduce. Questo potrebbe anche essere più veloce di un singolo 'flatMap' o' collect', a seconda di quanti oggetti temporanei vengono allocati, quindi rapidamente raccolti. –

+0

@DeanWampler Sapevo del pipelining ma è bello sapere che 'filter(). Map()' potrebbe essere più veloce di 'flatmap' o' collect' ... abbiamo sostituito molti 'map(). Filter()' di 'collect()' b/c si legge meglio ma sarà necessario controllare perf. Grazie. – maasg

+0

Grazie. Per ora, il modo "catena di mappe" non mi sta ostacolando. Analizzerò il suggerimento di una mappa piatta equivalente in Java 8 più tardi, quando guarderò in perf. – nir