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:打印每年的前十行的主要内容,如果未能解决你的问题,请参考以下文章