有人可以解释一下这段代码吗?

时间:2016-08-15 06:22:56

标签: scala recommendation-engine

根据此链接: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],这是什么意思?

2 个答案:

答案 0 :(得分:1)

评级是元组的集合:(时间戳%10,评级(userId,movieId,评级))。 _._ 2.user中的第一个下划线指的是map函数正在处理的当前元素。所以第一个下划线现在指的是一个元组(一对值)。对于一对元组t,你可以用速记符号表示它的第一和第二个元素: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))
}

答案 1 :(得分: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")