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
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")))
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.