В спарк я хотел бы посчитать, как значения меньше или равны другим значениям.Я пытался сделать это с помощью ранжирования, но в рангах получилось [1,2,2,2,3,4] -> [1,2,2,2,5,6]
, тогда как мне хотелось бы получить [1,2,2,2,3,4] -> [1,4,4,4,5,6]
в группе.Но это немного неуклюже и неэффективно.Есть ли лучший способ сделать это?
Редактировать: Добавлен минимальный пример того, что я пытаюсь сделать
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.rank
import org.apache.spark.sql.expressions.Window
object Question extends App {
val spark = SparkSession.builder.appName("Question").master("local[*]").getOrCreate()
import spark.implicits._
val win = Window.orderBy($"nums".asc)
Seq(1, 2, 2, 2, 3, 4)
.toDF("nums")
.select($"nums", rank.over(win).alias("rank"))
.as[(Int, Int)]
.groupByKey(_._2)
.mapGroups((rank, nums) => (rank, nums.toList.map(_._1)))
.map(x => (x._1 + x._2.length - 1, x._2))
.flatMap(x => x._2.map(num => (num, x._1)))
.toDF("nums", "rank")
.show(false)
}
Вывод:
+----+----+
|nums|rank|
+----+----+
|1 |1 |
|2 |4 |
|2 |4 |
|2 |4 |
|3 |5 |
|4 |6 |
+----+----+