2017-11-15 3 views
0

私はいくつかの色を持つデータセットを持ち、関連する日付を数えます。スパークに関連する値を持つ最大数

+-----------+----------+-----+ 
|  color|  Date|count| 
+-----------+----------+-----+ 
|  red|2014-05-26| 5| 
|  red|2014-05-02| 1| 
|  red|2015-04-02| 1| 
|  red|2015-04-26| 1| 
|  red|2015-09-26| 2| 
|  blue|2014-05-26| 3| 
|  blue|2014-06-02| 1| 
|  brown|2014-07-31| 2| 
|  green|2014-08-01| 2| 
+-----------+----------+-----+ 

関連する日付のある各色の最大カウントが必要です。私はJava 8でSpark 2.0.2を使用しています。

max関数を使用して日付カラムを削除したときに、groupByに日付を入力すると、入力データセットと同じテーブルが表示されます。

df.groupBy(color).max("count").show(); 

+-----------+----------+ 
|color  |max(count)| 
+-----------+----------+ 
|  red|   5| 
|  blue|   3| 
|  brown|   2| 
|  green|   2| 
+-----------+----------+ 

予想される出力:ここ

+-----------+----------+----------+ 
|color  |  date|max(count)| 
+-----------+----------+----------+ 
|  red|2014-05-26|   5| 
|  blue|2014-05-26|   3| 
|  brown|2014-07-31|   2| 
|  green|2014-08-01|   2| 
+-----------+----------+----------+ 

答えて

1

あなたが最大値とそれらに関連する列のfirst()ためagg()機能を使用することができますので、あなたは、最大値との関連列をしたいです。 firstcolorにグルーピングすることによって生成されたグループdateの最初の要素を返すため

df.groupBy(color).agg(first("date").alias(date),max("count")).show(); 

+-----------+----------+----------+ 
|color  |  date|max(count)| 
+-----------+----------+----------+ 
|  red|2014-05-26|   5| 
|  blue|2014-05-26|   3| 
|  brown|2014-07-31|   2| 
|  green|2014-08-01|   2| 
+-----------+----------+----------+ 
1

他の答えは部分的に正しいです。当該

max(count)はしたがってステートメント、その特定の色のための第1の位置に常にある:

df.groupBy(color).agg(first("date").alias(date),max("count")).show(); 

戻り正しい結果。

あなたのデータは、このようなものだった場合:問題のクエリは1カウントに対応し、グループ内の最初の日付を返します

df.show 
// red with highest count is at the bottom of the group 
+-----+----------+-----+ 
|color|  date|count| 
+-----+----------+-----+ 
| red|2014-05-02| 1| 
| red|2015-04-02| 1| 
| red|2015-04-26| 1| 
| red|2015-09-26| 2| 
| red|2014-05-26| 5| 
| blue|2014-05-26| 3| 
| blue|2014-06-02| 1| 
|brown|2014-07-31| 2| 
|green|2014-08-01| 2| 
+-----+----------+-----+ 

df.groupBy($"color").agg(first($"date").as("date") , max("count").as("count")).show 
+-----+----------+-----+ 
|color|  date|count| 
+-----+----------+-----+ 
|brown|2014-07-31| 2| 
|green|2014-08-01| 2| 
| blue|2014-05-26| 3| 
| red|2014-05-02| 5| 
+-----+----------+-----+ 

また、あなたはウィンドウ関数を使用することができますがここでは:

import org.apache.spark.sql.expression.Window 

val window = Window.partitionBy($"color").orderBy($"count".desc) 

df.withColumn("rn", row_number over window).where($"rn" === 1).drop($"rn").show 
+-----+----------+-----+ 
|color|  date|count| 
+-----+----------+-----+ 
|brown|2014-07-31| 2| 
|green|2014-08-01| 2| 
| blue|2014-05-26| 3| 
| red|2014-05-26| 5| 
+-----+----------+-----+ 
+0

私はscalaではなくjavaで解決策が必要です。 –

+0

@ dataScienctistこれは単なる方法です。私たちはここにあなたのコードを書くのではありません。答えを参考にして、それをあなた自身で解決しようとしています。また、Spark SQL APIは、JavaとScalaの両方で非常によく似ています。試してみると分かります。 – philantrovert

関連する問題