代码之家  ›  专栏  ›  技术社区  ›  Brian

Spark dataframe groupby列中的唯一值

  •  0
  • Brian  · 技术社区  · 7 年前

    我有以下数据帧:

    val df = Seq(
        ("A", 2.0),
        ("A", 1.5),
        ("B", 8.0),
        ("B", 9.0)
      ).toDF("id", "val")
    

    我想做一个小组,每个小组的唯一ID的基础上 进行连续计数(第一个是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 回复  |  直到 7 年前
        1
  •  1
  •   1pluszara    7 年前

    这里有一个方法。

    输入数据:

    +---+---+
    |id |val|
    +---+---+
    |A  |2.0|
    |A  |1.5|
    |A  |4.5|
    |A  |0.5|
    |B  |8.0|
    |B  |9.0|
    +---+---+
    

    使用row\u 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    |
    +---+---+-----+-----+