如何基于spark scala中的现有列添加新列

如何基于spark scala中的现有列添加新列,scala,apache-spark,Scala,Apache Spark,光环 我已经完成了在ApacheSpark中使用Mllib ALS构建推荐,并提供了输出 user | product | rating 1 | 20 | 0.002 1 | 30 | 0.001 1 | 10 | 0.003 2 | 20 | 0.002 2 | 30 | 0.001 2 | 10 | 0.003 但我需要根据评级排序更改数据结构,如下所示: user | product | rating | number_rangking

光环

我已经完成了在ApacheSpark中使用Mllib ALS构建推荐,并提供了输出

user | product | rating
    1 | 20 | 0.002
    1 | 30 | 0.001
    1 | 10 | 0.003
    2 | 20 | 0.002
    2 | 30 | 0.001
    2 | 10 | 0.003
但我需要根据评级排序更改数据结构,如下所示:

user | product | rating | number_rangking
    1 | 10 | 0.003 | 1
    1 | 20 | 0.002 | 2 
    1 | 30 | 0.001 | 3
    2 | 10 | 0.002 | 1
    2 | 20 | 0.001 | 2
    2 | 30 | 0.003 | 3
我该怎么做?也许任何人都能给我一个线索


thx

您所需要的只是一个窗口,它的功能取决于您选择的
排名
行数

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.rank

val w = Window.partitionBy($"user").orderBy($"rating".desc)

df.select($"*", rank.over(w).alias("number_rangking")).show
// +----+-------+------+---------------+
// |user|product|rating|number_rangking|
// +----+-------+------+---------------+
// |   1|     10| 0.003|              1|
// |   1|     20| 0.002|              2|
// |   1|     30| 0.001|              3|
// |   2|     10| 0.003|              1|
// |   2|     20| 0.002|              2|
// |   2|     30| 0.001|              3|
// +----+-------+------+---------------+
使用普通RDD,您可以
groupByKey
、本地处理和
flatMap

rdd
  // Convert to PairRDD
  .map{case (user, product, rating) => (user, (product, rating))}
  .groupByKey 
  .flatMap{case (user, vals) => vals.toArray
    .sortBy(-_._2) // Sort by rating
    .zipWithIndex // Add index
    // Yield final values
    .map{case ((product, rating), idx) => (user, product, rating, idx + 1)}}