2016-04-14 3 views
0

Ich folge diesem example, um einen einfachen personalisierten Demo-Empfehler mit Spark MLLib zu erstellen.Missverständnis einiger Teile eines Beispiels in Spark MLlib

ich falsch verstehen leicht die Bedeutung von _._2.user und _._2.product in diesen Zeilen Code:

val numUsers = ratings.map(_._2.user).distinct.count 
val numMovies = ratings.map(_._2.product).distinct.count 

Was 2 anzeigt? Es sieht auch aus wie user und product zum ersten Mal in dieser Zeile erscheinen. Also, wie sind sie mit userId und movieId verknüpft?

Antwort

2

_1, _2, ... _2 sind Methoden zum Extrahieren von Elementen der Tupel in Scala. Diese haben hier keinen besonderen Spark-spezifischen Kontext. user und product sind Felder eines Rating. Und da ratings wird RDD[(Long, Rating)] wie folgt erstellt:

val ratings = sc.textFile(...).map { line => 
    ... 
    (fields(3).toLong % 10, // Long 
    Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)) // Rating 
} 

Sie ein vollständiges Bild haben sollten.

1

ratings hat Typ RDD[(Int, Rating)]. So ratings.map nimmt eine Funktion mit (Int, Rating) Argument, und _ in _.something steht für dieses Argument. _2 liefert das zweite Feld des Tupels (Rating) und user und product werden in der Deklaration Rating deklariert.