web-dev-qa-db-fra.com

PySpark - obtenir le numéro de ligne pour chaque ligne d'un groupe

En utilisant pyspark, j'aimerais pouvoir regrouper un spark dataframe, trier le groupe, puis fournir un numéro de ligne. Donc

Group    Date
  A      2000
  A      2002
  A      2007
  B      1999
  B      2015

Deviendrait

Group    Date    row_num
  A      2000      0
  A      2002      1
  A      2007      2
  B      1999      0
  B      2015      1
7
Luke

Utiliser la fonction de fenêtre:

from pyspark.sql.window import *
from pyspark.sql.functions import row_number

df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date")))
18
user8419108

La solution acceptée a presque raison. Voici la solution basée sur la sortie demandée dans la question:

df = spark.createDataFrame([("A", 2000), ("A", 2002), ("A", 2007), ("B", 1999), ("B", 2015)], ["Group", "Date"])

+-----+----+
|Group|Date|
+-----+----+
|    A|2000|
|    A|2002|
|    A|2007|
|    B|1999|
|    B|2015|
+-----+----+

# accepted solution above


from pyspark.sql.window import *
from pyspark.sql.functions import row_number

df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date")))


# accepted solution above output


+-----+----+-------+
|Group|Date|row_num|
+-----+----+-------+
|    B|1999|      1|
|    B|2015|      2|
|    A|2000|      1|
|    A|2002|      2|
|    A|2007|      3|
+-----+----+-------+

Comme vous pouvez le voir, la fonction row_number commence à 1 et non à 0 et la question demandée voulait que le row_num commence à 0. Changement simple comme je l'ai fait ci-dessous:

df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date"))-1).show()

Production :

+-----+----+-------+
|Group|Date|row_num|
+-----+----+-------+
|    B|1999|      0|
|    B|2015|      1|
|    A|2000|      0|
|    A|2002|      1|
|    A|2007|      2|
+-----+----+-------+

Ensuite, vous pouvez trier la colonne "Groupe" dans l'ordre que vous souhaitez. La solution ci-dessus l'a presque, mais il est important de se rappeler que row_number commence par 1 et non par 0.

1
Rahul P