Правильный способ сделать это - использовать monotonically_increasing_id
val df = Seq(Seq("a", "b", "c"), Seq("e", "f", "g"), Seq("h", "i")).toDF("f1")
df
.withColumn("uid", monotonically_increasing_id)
.withColumn("f1", explode($"f1"))
.show
// +---+---+
// | f1|uid|
// +---+---+
// | a| 0|
// | b| 0|
// | c| 0|
// | e| 1|
// | f| 1|
// | g| 1|
// | h| 2|
// | i| 2|
// +---+---+
Число не обязательно должно быть последовательным, как в примере, но будет однозначно идентифицировать источник.
Не использовать rank().over(Window.orderBy("f1"))
.Он по своей сути последовательный и не масштабируемый, и его следует избегать, за исключением локального Datasets
(то есть того, который возвращает true
из isLocal
).