कुल समय के आधार पर देखने वाले प्रत्येक id के लिए शीर्ष N गेम ढूंढें, इसलिए मेरा इनपुट डेटाफ़्रेम यहां है:

इनपुटडीएफ:

id    |    Game  |  Time
 1           A       10
 2           B       100
 1           A       100
 2           C       105
 1           N       103
 2           B       102
 1           N       90
 2           C       110

और यह वह आउटपुट है जिसकी मैं उम्मीद कर रहा हूं:

आउटपुटडीएफ:

id    |  Game   |  Time|
 1          N       193
 1          A       110
 2          C       215
 2          B       202

यहां मैंने जो कोशिश की है, लेकिन यह अपेक्षा के अनुरूप काम नहीं कर रहा है:

val windowDF = Window.partitionBy($"id").orderBy($"Time".desc)
   
   InputDF.withColumn("rank", row_number().over(windowDF))
      .filter("rank<=10")
1
Bonzo 13 सितंबर 2020, 16:07

1 उत्तर

सबसे बढ़िया उत्तर

आपकी शीर्ष-एन रैंकिंग प्रति गेम total time के बजाय केवल व्यक्तिगत time पर लागू होती है। एक groupBy/sum total time की गणना करने के बाद total time पर एक रैंकिंग करेगा:

val df = Seq(
  (1, "A", 10),
  (2, "B", 100),
  (1, "A", 100),
  (2, "C", 105),
  (1, "N", 103),
  (2, "B", 102),
  (1, "N", 90),
  (2, "C", 110)
).toDF("id", "game", "time")

import org.apache.spark.sql.expressions.Window
val win = Window.partitionBy($"id").orderBy($"total_time".desc)

df.
  groupBy("id", "game").agg(sum("time").as("total_time")).
  withColumn("rank", row_number.over(win)).
  where($"rank" <= 10).
  show
// +---+----+----------+----+
// | id|game|total_time|rank|
// +---+----+----------+----+
// |  1|   N|       193|   1|
// |  1|   A|       110|   2|
// |  2|   C|       215|   1|
// |  2|   B|       202|   2|
// +---+----+----------+----+
1
Leo C 13 सितंबर 2020, 19:09