Spark:打印每年的前十行

Posted

技术标签:

【中文标题】Spark:打印每年的前十行【英文标题】:Spark: Print the first ten rows of every year 【发布时间】:2018-05-16 12:35:58 【问题描述】:

我在 Spark 中有数据集,其中有两列:字符串列(字符串由前 4 个字符中的年份组成,而其余字符是一个单词)和整数列。数据集行示例:“2004-dog” 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);

【问题讨论】:

您可以使用数据框 api 并使用 Window 函数来完成。 【参考方案1】:

这里只是一个例子:

输入数据:

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

希望这会有所帮助!

【讨论】:

以上是关于Spark:打印每年的前十行的主要内容,如果未能解决你的问题,请参考以下文章

四第十行 打印第十行 查找-常用命令

Linux之headtail

如何用一句python代码打印五行“abc”,注意是十行?

正则表达式:sed

记录打印杨辉三角-C语言

11 while循环嵌套