首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PySpark -获取组中每行的行号

PySpark -获取组中每行的行号
EN

Stack Overflow用户
提问于 2017-08-05 03:12:06
回答 2查看 35K关注 0票数 19

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

代码语言:javascript
运行
复制
Group    Date
  A      2000
  A      2002
  A      2007
  B      1999
  B      2015

会变成

代码语言:javascript
运行
复制
Group    Date    row_num
  A      2000      0
  A      2002      1
  A      2007      2
  B      1999      0
  B      2015      1
EN

Stack Overflow用户

发布于 2018-07-25 03:34:41

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

代码语言:javascript
运行
复制
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开始。下面是我所做的简单更改:

代码语言:javascript
运行
复制
df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date"))-1).show()

输出:

代码语言:javascript
运行
复制
+-----+----+-------+
|Group|Date|row_num|
+-----+----+-------+
|    B|1999|      0|
|    B|2015|      1|
|    A|2000|      0|
|    A|2002|      1|
|    A|2007|      2|
+-----+----+-------+

然后你可以按你想要的任何顺序对"Group“列进行排序。上面的解决方案几乎就是这样,但重要的是要记住,row_number是从1开始的,而不是0。

票数 3
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45513959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档