-2

私はデータセットtest1.txtを持っています。以下のようなデータが含まれていますScalaでデータを集計する方法は?

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 

しかし、私は以下のような出力を表示したいと考えています。重複した組み合わせを削除し、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 

どうすればこの問題を解決できますか。

+1

dataframe.groupBy( "column1"、 "column2")。sum( "column3")は動作します。 – Fabich

+0

ありがとうございます –

答えて

0
ratings.groupBy("userId","movieId").sum(rating) 
+0

このコードは、重複する行を削除する要件を満たしていません。 'groupBy'の前に' distinct'が必要です。 – Sim

3

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]として、最終的な結果をしたいと思うことを確認していないとdistinctsumロジックが問題になっている例として、それをしたいと思うように正確であるかどうかは非常に明確ではありませんしかし、うまくいけば、これはあなたに必要なものを与えるでしょう。

関連する問題