scala - 按元组的第三个元素排序,然后按第一个元素分组并分配排名

标签 scala apache-spark

我对 apache-spark 和 scala 都很陌生,所以如果这是一个微不足道的问题,我深表歉意。

我正在尝试构建一个推荐系统,并拥有一个形式为(用户、产品、预测评级)的 RDD。

我想要实现的目标:

按用户分组,我想要一个产品列表(按评级降序排序),并根据此列表(针对每个用户)为预测分配排名。谁能告诉我如何才能实现这一目标?

下面的代码显然不起作用,但这就是我想要实现的目标

val xyz = ratesAndPreds.map{case ((user,product),(r1,r2)) => (user,product,r2)}

val def = xyz.sortBy(_._3)

val abc = abc.groupByKey()

任何帮助将不胜感激。

最佳答案

这应该可以解决问题:

val groupedByUser = xyz.groupBy(_._1)
val sortedProductsByUser = groupedByUser mapValues { triples =>
  // this is done for every user, for its list of (user, product, rating)
  // (yes, user is thus the same for all the elements of triples here)
  val sortedTriples = triples.sortBy(_._3) // assuming rating has an Ordering, e.g., it's an Int
  val keepOnlyProducts = sortedTriples.map(_._2)
  keepOnlyProducts
}

关于scala - 按元组的第三个元素排序,然后按第一个元素分组并分配排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369794/

相关文章:

scala - 如何正确使用 scalac -Xlint

apache-spark - 以编程方式确定 Spark 可用的核心数量和内存量

java - 如何从 Java/Spring 创建类型化的 Tuple2?

Scala 3 TypeRepr 匹配更高级的类型

apache-spark - Spark 是否受益于持久表中的 `sortBy`?

scala - 从 Spark 数据框中选择几列,并以列列表作为开始

apache-spark - HDFS 和 Spark : Best way to write a file and reuse it from another program

scala - 如何定义自定义聚合函数来对向量列求和?

scala - 使用 typetag 检查一个类型是否是另一个类型的父类(super class)型

java - 使用 Ant 构建包含混合 Scala 和 Java 源文件的项目 - 非法循环引用错误