Это хороший вариант использования для Window
функций агрегирования
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
, за исключением того, что вместо каждой группы возвращая одно значение, каждая строка в каждой группе возвращает одно значение.В этом случае значением является позиция строки в пределах группы строк той же категории.Кроме того, если это тот эффект, которого вы пытаетесь достичь, то вам не нужно предварительно сортировать столбец category
заранее.