我有以下数据框:
val df = Seq(
("A", 2.0),
("A", 1.5),
("B", 8.0),
("B", 9.0)
).toDF("id", "val")
我想根据唯一ID为每个组执行一个组 1.有一个运行计数,即第一个是0,第二个是1 2.小组内的总数。
应该看起来像
+---+---+---+---+
| id|val|order|count|
+---+---+---+---+
| A|2.0|0 |2
| A|1.5|1 |2
| A|2.5|2 |2
| B|8.0|0|2
| B|9.0|1 |2
+---+---+
我不知道如何使用spark sql或函数执行此操作。
答案 0 :(得分:1)
这是一种方式。
输入数据:
+---+---+
|id |val|
+---+---+
|A |2.0|
|A |1.5|
|A |4.5|
|A |0.5|
|B |8.0|
|B |9.0|
+---+---+
使用row_number函数获取订单计数。
val w1 = Window.partitionBy("id").orderBy(lit(null))
df.withColumn("rank", row_number().over(w1))
.withColumn("order", 'rank - 1)
.withColumn("count",count('order).over(w1))
.drop('rank)
.orderBy('id)
.show(false)
两者都给出了相同的结果:
+---+---+-----+-----+
|id |val|order|count|
+---+---+-----+-----+
|A |2.0|0 |4 |
|A |1.5|1 |4 |
|A |4.5|2 |4 |
|A |0.5|3 |4 |
|B |8.0|0 |2 |
|B |9.0|1 |2 |
+---+---+-----+-----+