如何使用Scala在Spark dataframe中为每个不同的列值创建行id的列

如何使用Scala在Spark dataframe中为每个不同的列值创建行id的列,scala,apache-spark,azure-data-factory,Scala,Apache Spark,Azure Data Factory,我在scala spark中有一个数据帧 类别|分数| A | 0.2 A | 0.3 A | 0.3 B | 0.9 B | 0.8 B | 1 我想 将行id列添加为 类别|分数|行id A | 0.2 | 0 A | 0.3 | 1 A | 0.3 | 2 B | 0.9 | 0 B | 0.8 | 1 B | 1 | 2 基本上,我希望列类别中每个不同的值的行id都是单调递增的。我已经有了一个已排序的数据框,因此具有相同类别的所有行都被分组在一起。但是,我仍然不知道如何生成新类别出现时重

我在scala spark中有一个数据帧

类别|分数|

A | 0.2

A | 0.3

A | 0.3

B | 0.9

B | 0.8

B | 1

我想 将行id列添加为

类别|分数|行id

A | 0.2 | 0

A | 0.3 | 1

A | 0.3 | 2

B | 0.9 | 0

B | 0.8 | 1

B | 1 | 2


基本上,我希望列类别中每个不同的值的行id都是单调递增的。我已经有了一个已排序的数据框,因此具有相同类别的所有行都被分组在一起。但是,我仍然不知道如何生成新类别出现时重新启动的行id。请帮忙

这是聚合函数的一个很好的用例

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.row_number
import df.sparkSession.implicits._

val window = Window.partitionBy('category).orderBy('score)
df.withColumn("row-id", row_number.over(window))
窗口函数的工作方式有点像
groupBy
,不同的是,每个组中的每一行都返回一个值,而不是每个组返回一个值。在这种情况下,该值是行在同一类别的行组中的位置。此外,如果这是您试图实现的效果,那么您不需要事先对列
类别
进行预排序