谁能解释一下这段代码?

Could Anyone explain about this code?

根据这个 link: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],什么意思?

ratings 是元组的集合:(timestamp % 10, Rating(userId, movieId, rating))。 _._2.user 中的第一个下划线指的是 map 函数正在处理的当前元素。所以第一个下划线现在指的是一个元组(一对值)。对于一对元组 t,您可以在 shorthand 符号中引用它的第一个和第二个元素: t._1 & t._2 所以 _._2 选择当前正在由 map 函数处理的元组的第二个元素。

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))
}

那是访问元组元素:下面的例子可能会更好地解释它。

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")