2016-08-15 5 views
0

по этой ссылке: https://github.com/amplab/training/blob/ampcamp6/machine-learning/scala/solution/MovieLensALS.scalaМожет ли кто-нибудь объяснить этот код?

Я не понимаю, что это точка:

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

_._2.[user|product], что это значит?

+0

'рейтинги' содержит кортеж элементов' N'. '_._ 2' означает« доступ к кортежу в месте второго элемента ». '_' является заполнителем для всего кортежа, это эквивалентно' .map (x => x._2) ' –

ответ

1

Это доступ к элементам кортежа: Следующий пример может объяснить это лучше.

val xs = List(
    (1, "Foo"), 
    (2, "Bar") 
) 

xs.map(_._1) // => List(1,2) 
xs.map(_._2) // => List("Foo", "Bar") 

// An equivalent way to write this 
xs.map(e => e._1) 
xs.map(e => e._2) 

// Perhaps a better way is 
xs.collect {case (a, b) => a} // => List(1,2) 
xs.collect {case (a, b) => b} // => List("Foo", "Bar") 
1

оценки - это набор кортежей: (timestamp% 10, Rating (userId, movieId, rating)). Первое подчеркивание в _._ 2.user означает текущий элемент, обрабатываемый функцией отображения. Итак, первое подчеркивание теперь относится к кортежу (пара значений). Для парного кортежа t вы можете ссылаться на его первый и второй элементы в сокращенной нотации: t._1 & t._2 Итак, _._ 2 выбирает второй элемент кортежа, который в настоящее время обрабатывается функцией отображения.

val ratings = sc.textFile(movieLensHomeDir + "/ratings.dat").map { line => 
    val fields = line.split("::") 
    // format: (timestamp % 10, Rating(userId, movieId, rating)) 
    (fields(3).toLong % 10, Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)) 
} 
+0

ok, спасибо за ваше объяснение –

Смежные вопросы