Чтобы воспроизвести этот вывод, вы можете использовать Window
, чтобы получить row_number
для каждого id
, а затем concat
добавить его в id
.
import pyspark.sql.functions as f
from pyspark.sql import Window
w = Window.partitionBy("id").orderBy("name")
df.withColumn("row_number", f.row_number().over(w)-1)\
.withColumn(
"id",
f.when(
f.col("row_number") > 0,
f.concat(f.col("id"), f.col("row_number"))
).otherwise(f.col("id"))
)\
.drop("row_number")\
.show()
#+---+----+
#| id|name|
#+---+----+
#| 1| joe|
#| 11|john|
#| 3| jo|
#| 2|jane|
#+---+----+
Примечание : при этом столбец id
преобразуется в столбец StringType
, если его еще нет.
Чтобы получить результат, который вы первоначально указали в вопросе, в качестве желаемого результата, вам нужно добавить столбец подсчета групп в дополнение к вычислению номера строки.Объединять номер строки только в том случае, если число больше единицы.
import pyspark.sql.functions as f
from pyspark.sql import Window
w = Window.partitionBy("id")
df.withColumn("count", f.count("*").over(w))\
.withColumn("row_number", f.row_number().over(w.orderBy("name")))\
.withColumn(
"id",
f.when(
f.col("count") > 1,
f.concat(f.col("id"), f.col("row_number"))
).otherwise(f.col("id"))
)\
.drop("count", "row_number")\
.show()
#+---+----+
#| id|name|
#+---+----+
#| 11| joe|
#| 12|john|
#| 3| jo|
#| 2|jane|
#+---+----+