2015-03-25 14 views
7

Ho letto il codice sorgente di un progetto, che si trova:Apache-Spark: che cos'è la stenografia della mappa (_._ 2)?

val sampleMBR = inputMBR.map(_._2).sample 

inputMBR è una tupla.

la funzione map 's definizione è:

map[U classTag](f:T=>U):RDD[U] 

sembra che map(_._2) è la scorciatoia per map(x => (x._2)).

Chiunque può dirmi le regole di quelle abbreviazioni?

risposta

11

La sintassi _ può essere un po 'confusa. Quando _ è usato da solo, rappresenta un argomento nella funzione anonima. Quindi, se lavoriamo su coppie: map(_._2 + _._2) sarebbe la stenografia per map(x, y => x._2 + y._2). Quando _ è usato come parte di un nome di funzione (o di un nome di valore) non ha alcun significato speciale. In questo caso, x._2 restituisce il secondo elemento di una tupla (supponendo che x sia una tupla).

6

collection.map (_._ 2) emette un secondo componente della tupla. Esempio da puro Scala (Spark RDD funzionano allo stesso modo):

scala> val zipped = (1 to 10).zip('a' to 'j') 
zipped: scala.collection.immutable.IndexedSeq[(Int, Char)] = Vector((1,a), (2,b), (3,c), (4,d), (5,e), (6,f), (7,g), (8,h), (9,i), (10,j)) 

scala> val justLetters = zipped.map(_._2) 
justLetters: scala.collection.immutable.IndexedSeq[Char] = Vector(a, b, c, d, e, f, g, h, i, j) 
+1

Questo è chiaro !! – Jordon

0

Ho trovato le soluzioni.

Prima il underscore qui è come segnaposto.

Per effettuare una letterale funzione ancora più conciso, è possibile utilizzare underscore come segnaposto per uno o più parametri, a condizione che ogni parametro compare una sola volta all'interno della funzione letterale.

Vedere di più su underscore in Scala al What are all the uses of an underscore in Scala?.

3

Due caratteri di sottolineatura in "_._2" sono diversi.

Primo '_' è per segnaposto di funzione anonima; Il secondo '_2' è membro della classe di caso Tuple.

Qualcosa di simile:

caso classe Tuple3 (_1: T1, _2: T2, _3: T3) {...}

0

La prima ' _ 'si riferisce a ciò che è mappato e poiché ciò che è mappato è una tupla si potrebbe chiamare qualsiasi funzione all'interno della tupla e uno del metodo è' _2 ', quindi quello che ci dice in basso trasforma l'input nel suo secondo attributo.

Problemi correlati