Luk*_*uke 6 apache-spark apache-spark-sql pyspark spark-dataframe pyspark-sql
使用pyspark,我希望能够对spark数据帧进行分组,对组进行排序,然后提供行号.所以
Group Date
A 2000
A 2002
A 2007
B 1999
B 2015
Run Code Online (Sandbox Code Playgroud)
会成为
Group Date row_num
A 2000 0
A 2002 1
A 2007 2
B 1999 0
B 2015 1
Run Code Online (Sandbox Code Playgroud)
小智 16
使用窗口功能:
from pyspark.sql.window import *
from pyspark.sql.functions import row_number
df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date")))
Run Code Online (Sandbox Code Playgroud)
公认的解决方案几乎是正确的。这是基于问题中请求的输出的解决方案:
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|
+-----+----+-------+
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,函数 row_number 从 1 而不是 0 开始,并且所请求的问题希望 row_num 从 0 开始。简单的更改如下:
df.withColumn("row_num", row_number().over(Window.partitionBy("Group").orderBy("Date"))-1).show()
Run Code Online (Sandbox Code Playgroud)
输出 :
+-----+----+-------+
|Group|Date|row_num|
+-----+----+-------+
| B|1999| 0|
| B|2015| 1|
| A|2000| 0|
| A|2002| 1|
| A|2007| 2|
+-----+----+-------+
Run Code Online (Sandbox Code Playgroud)
然后您可以按照您想要的任何顺序对“组”列进行排序。上面的解决方案几乎已经有了它,但重要的是要记住 row_number 以 1 而不是 0 开头。
| 归档时间: |
|
| 查看次数: |
15087 次 |
| 最近记录: |