PySpark - 获取组中每行的行号

时间:2017-08-04 19:12:06

标签: apache-spark pyspark apache-spark-sql spark-dataframe pyspark-sql

使用pyspark,我希望能够对spark数据帧进行分组,对组进行排序,然后提供行号。所以

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

会变成

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

2 个答案:

答案 0 :(得分:15)

使用窗口功能:

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

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

答案 1 :(得分:1)

公认的解决方案几乎是正确的。这是基于问题中要求的输出的解决方案:

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|
+-----+----+-------+

如您所见,函数row_number从1开始而不是0,所请求的问题希望row_num从0开始。像我在下面所做的简单更改:

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

输出:

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

然后,您可以按任意顺序对“组”列进行排序。上面的解决方案几乎可以解决这个问题,但是请务必记住row_number以1开头而不是0。