Spark:打印每年的前十行

时间:2018-05-16 12:35:58

标签: java apache-spark apache-spark-sql spark-streaming

我在Spark中有数据集,其中有两列:字符串列(字符串由前4个字符中的年份组成,其余字符为单词)和列Integer。数据集行示例:" 2004-dog"我不知道如何打印每年的前十行。我到了这一点:

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 :(得分:0)

这只是一个例子:

输入数据:

+-------+---+
|   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|
+----+---+----+     

希望这有帮助!