首页 > 解决方案 > Apache Spark - 根据列值添加增量 ID

问题描述

我想根据列值创建一个增量 id。

例如,如果我有下表

-----------------------
| id |   value    |
-----------------------
| 3  |    a       |
| 2  |    a       | 
| 1  |    b       |
| 4  |    b       |
| 5  |    c       |
-----------------------

我想创建一个具有随机或增量标识符的新列,该标识符对于列值是唯一的,如下所示:

-----------------------------------------------
| id |   value    |    new_id    |
-----------------------------------------------
| 3  |    a       |     1        | 
| 2  |    a       |     1        |
| 1  |    b       |     2        |
| 4  |    b       |     2        |
| 5  |    c       |     3        |
-----------------------------------------------

除了使用 distinct 并稍后加入之外,还有其他选择吗?

谢谢!

标签: apache-spark

解决方案


您可以在 Window 中使用 dense_rank() 并按值排序,但是这会将所有数据移动到单个分区,因此对于大型 DataSet 会表现不佳。

val window =   Window.orderBy($"value")

df.withColumn("new_id", dense_rank.over(window))

编辑 - 似乎使用虚拟分区可确保数据被打乱到 spark.sql.shuffle.partitions 分区

val window =   Window.partitionBy(lit(0)).orderBy($"value")

推荐阅读