在Spark Dataframe

时间:2018-05-08 12:21:15

标签: apache-spark pyspark apache-spark-sql window-functions

我有一个数据框,我想在每个Window分区中给出id。例如,我有

id | col |
1  |  a  |
2  |  a  |
3  |  b  |
4  |  c  |
5  |  c  |

所以我想(基于列col的分组)

id | group |
1  |  1    |
2  |  1    |
3  |  2    |
4  |  3    |
5  |  3    |

我想使用窗口函数,但无论如何我都找不到为每个窗口分配一个Id。我需要这样的东西:

w = Window().partitionBy('col')
df = df.withColumn("group", id().over(w)) 

有没有办法实现这样的事情。 (我不能简单地使用col作为组ID,因为我有兴趣在多列上创建一个窗口)

2 个答案:

答案 0 :(得分:3)

只需在窗口功能上使用dense_rank 内置功能即可为您提供所需的结果

from pyspark.sql import window as W
import pyspark.sql.functions as f
df.select('id', f.dense_rank().over(W.Window.orderBy('col')).alias('group')).show(truncate=False)

应该给你

+---+-----+
|id |group|
+---+-----+
|1  |1    |
|2  |1    |
|3  |2    |
|4  |3    |
|5  |3    |
+---+-----+

答案 1 :(得分:0)

您可以为原始数据框分配不同row_number和自col的{​​{1}}。

join

代码位于val data = Seq( (1, "a"), (2, "a"), (3, "b"), (4, "c"), (5, "c") ).toDF("id","col") val df2 = data.select("col").distinct() .withColumn("group", row_number().over(Window.orderBy("col"))) val result = data.join(df2, Seq("col"), "left") .drop("col") ,但可以轻松更改为scala

希望这有帮助