Как игнорировать первый элемент в Groupby в Scala /Spark?

Я использую Spark2, Zeppelin и Scala, чтобы показать 10 лучших вхождений слов в наборе данных. Мой код:

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

дает: Как мне проигнорировать "кошку" и сделать так, чтобы сюжет начинался с "шляпы", т.е. показывал элементы со второго по последний?

Я старался:

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 ответа

Решение

Не просто удалить первую строку в кадре данных (см. также Удаление первой строки 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|
+-----+-----+

Первый ряд можно удалить таким образом:

val filteredValue = dfGrouped.first.get(0)
val result = dfGrouped.filter(s"value!='$filteredValue'")
Другие вопросы по тегам