谁能解释一下这段代码?
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")
根据这个 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")