Apache spark PySpark-获取组中每一行的行号

Apache spark PySpark-获取组中每一行的行号,apache-spark,pyspark,apache-spark-sql,spark-dataframe,pyspark-sql,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

使用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
使用窗口功能:

从pyspark.sql.window导入*
从pyspark.sql.functions导入行号
df.withColumn(“row_num”,row_number()。超过(Window.partitionBy(“Group”).orderBy(“Date”))

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

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

然后,您可以按照您想要的顺序对“Group”列进行排序。上面的解决方案几乎解决了这个问题,但重要的是要记住,行号是从1开始的,而不是从0开始的。

Nice!我在
withColumn
中插入了一个缺少的逗号:)欢迎来到SO,祝贺您回答了第一个问题!继续,不要失望(有时可能是一个严酷的地方…)-检查我的编辑,看看如何使用代码highlighting@desertnaut我们可以保留数据帧的自然顺序而不是按排序吗?为什么所有的仇恨?不幸的是,有一种错误的印象,认为一个问题必须包括自己测试过的代码(但不起作用),尽管根据SO提问指南,情况肯定不是这样: