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

如何在Scala/Spark中忽略Groupby中的第一个元素?

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

    z.show(dfFlat.groupBy("value").count().sort(desc("count")), 10)
    

    给予: enter image description here 我如何忽略“猫”,让情节从“帽子”开始,即从第二个元素到最后一个元素?

    我试过:

    z.show(dfFlat.groupBy("value").count().sort(desc("count")).slice(2,4), 10)
    

    error: value slice is not a member of org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Raphael Roth    7 年前

    删除数据帧中的第一行并非易事(另请参见 Drop first row of Spark DataFrame ). 但您可以使用窗口函数来实现:

    val df = Seq(
      "cat", "cat", "cat", "hat", "hat", "bat"
    ).toDF("value")
    
    
    val dfGrouped = df
      .groupBy($"value").count()
      .sort($"count".desc)
    
    dfGrouped.show()
    
    +-----+-----+
    |value|count|
    +-----+-----+
    |  cat|    3|
    |  hat|    2|
    |  bat|    1|
    +-----+-----+
    
    val dfWithoutFirstRow = dfGrouped
      .withColumn("rank", dense_rank().over(Window.partitionBy().orderBy($"count".desc)))
      .where($"rank" =!= 1).drop($"rank") // this filters "cat"
      .sort($"count".desc)
    
    
    dfWithoutFirstRow
      .show()
    
    +-----+-----+
    |value|count|
    +-----+-----+
    |  hat|    2|
    |  bat|    1|
    +-----+-----+
    
        2
  •  0
  •   pasha701    7 年前

    第一行可以这样删除:

    val filteredValue = dfGrouped.first.get(0)
    val result = dfGrouped.filter(s"value!='$filteredValue'")