【问题标题】:How to create a column of row id in Spark dataframe for each distinct column value using Scala如何使用 Scala 在 Spark 数据框中为每个不同的列值创建行 ID 列
【发布时间】:2019-02-23 22:54:21
【问题描述】:
我在 scala spark 中有一个数据框
类别 |分数 |
一个 | 0.2
一个 | 0.3
一个 | 0.3
B | 0.9
B | 0.8
B | 1
我想
添加行 id 列为
类别 |分数 |行号
一个 | 0.2 | 0
一个 | 0.3 | 1
一个 | 0.3 | 2
B | 0.9 | 0
B | 0.8 | 1
B | 1 | 2
基本上,我希望行 id 对于列类别中的每个不同值单调递增。我已经有一个排序的数据框,因此具有相同类别的所有行都分组在一起。但是,我仍然不知道如何生成新类别出现时重新启动的row_id。请帮忙!
【问题讨论】:
标签:
scala
apache-spark
azure-data-factory
【解决方案1】:
这是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,除了不是每个group 返回单个值,而是每个组中的每个row 返回单个值。在这种情况下,该值是该行在同一类别的行组中 的位置。此外,如果这是您想要达到的效果,那么您不需要事先对列 category 进行预排序。