Spark: печатать первые десять строк каждого года - PullRequest
0 голосов
/ 16 мая 2018

У меня есть набор данных в Spark, где есть два столбца: строковый столбец (строка состоит из года в первых 4 символах, а остальные символы состоят из слова) и столбец Integer. Пример строки набора данных: «2004-собака» 45. Я не знаю, как печатать первые десять строк каждого года. Я прибыл в этот момент:

JavaRDD<String> mentions =
            tweets.flatMap(s -> Arrays.asList(s.split(":")).iterator());  


JavaPairRDD<String, Integer> counts =
            mentions.mapToPair(mention -> new Tuple2<>(mention, 1))
            .reduceByKey((x, y) -> x + y);

1 Ответ

0 голосов
/ 17 мая 2018

Вот только пример:

Входные данные:

+-------+---+
|   year|cnt|
+-------+---+
|2015:04| 50|
|2015:04| 40|
|2015:04| 50|
|2017:04| 55|
|2017:04| 20|
|2017:04| 20|
+-------+---+

И, при условии, что у вас есть несколько критериев для выбора вершины 10. Создайте функцию окна

import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._

val w = Window.partitionBy("year").orderBy(desc("cnt"))

df.withColumn("year", split('year,":")(0))
  .withColumn("rank", row_number.over(w)) //use rank/dense_rank as you need 
  .filter('rank <= 2) //replace 10 here
  //.drop("rank") //you can drop rank if you want
  .show()

Результат:

+----+---+----+
|year|cnt|rank|
+----+---+----+
|2017| 55|   1|
|2017| 20|   2|
|2015| 50|   1|
|2015| 50|   2|
+----+---+----+     

Надеюсь, это поможет!

...