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

时间:2017-09-05 10:51:28

标签: scala apache-spark apache-zeppelin

我使用Spark2,Zeppelin和Scala来显示数据集中出现的前10个单词。 我的代码:

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 个答案:

答案 0 :(得分:1)

它不能直接删除数据框中的第一行(另请参阅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|
+-----+-----+

答案 1 :(得分:0)

可以通过以下方式删除第一行:

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