Spark数据帧组由列中的唯一值组成

时间:2018-05-18 15:14:43

标签: apache-spark-sql

我有以下数据框:

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或函数执行此操作。

1 个答案:

答案 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    |
+---+---+-----+-----+