如何使用Scala在Spark中聚合数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Scala在Spark中聚合数据?相关的知识,希望对你有一定的参考价值。
我有一个数据集test1.txt
。它包含如下数据
2::1::3
1::1::2
1::2::2
2::1::5
2::1::4
3::1::2
3::1::1
3::2::2
我使用下面的代码创建了数据框架。
case class Test(userId: Int, movieId: Int, rating: Float)
def pRating(str: String): Rating = {
val fields = str.split("::")
assert(fields.size == 3)
Test(fields(0).toInt, fields(1).toInt, fields(2).toFloat)
}
val ratings = spark.read.textFile("C:/Users/test/Desktop/test1.txt").map(pRating).toDF()
2,1,3
1,1,2
1,2,2
2,1,5
2,1,4
3,1,2
3,1,1
3,2,2
但我想打印下面的输出I.e.删除重复的组合,而不是field(2) value sum of values1,1, 2.0
。
1,1,2.0
1,2,2.0
2,1,12.0
3,1,3.0
3,2,2.0
请帮帮我,怎么能实现这个。
答案
要删除重复项,请使用df.distinct
。首先汇总你groupBy
然后agg
。把这一切放在一起:
case class Rating(userId: Int, movieId: Int, rating: Float)
def pRating(str: String): Rating = {
val fields = str.split("::")
assert(fields.size == 3)
Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat)
}
val ratings = spark.read.textFile("C:/Users/test/Desktop/test1.txt").map(pRating)
val totals = ratings.distinct
.groupBy('userId, 'movieId)
.agg(sum('rating).as("rating"))
.as[Rating]
我不确定你是否希望最终结果为Dataset[Rating]
以及distinct
和sum
逻辑是否与你想要的完全一样,因为问题中的例子不是很清楚,但希望这会给你所需要的。
另一答案
ratings.groupBy("userId","movieId").sum(rating)
以上是关于如何使用Scala在Spark中聚合数据?的主要内容,如果未能解决你的问题,请参考以下文章
使用scala在Spark中转置DataFrame而不进行聚合