2016-07-20 5 views
1

Ich versuche, die folgende Lösung zu implementieren: window functionSpark, Hive SQL - Fensterfunktion implementieren?

Ich habe folgendes df:

+------------+----------------------+-------------------+         
|increment_id|base_subtotal_incl_tax|   eventdate|         
+------------+----------------------+-------------------+         
|  1086|   14470.0000|2016-06-14 09:54:12|         
|  1086|   14470.0000|2016-06-14 09:54:12|         
|  1086|   14470.0000|2015-07-14 09:54:12|         
|  1086|   14470.0000|2015-07-14 09:54:12|         
|  1086|   14470.0000|2015-07-14 09:54:12|         
|  1086|   14470.0000|2015-07-14 09:54:12|         
|  1086|    1570.0000|2015-07-14 09:54:12|         
|  5555|   14470.0000|2014-07-14 09:54:12|         
|  5555|   14470.0000|2014-07-14 09:54:12|         
|  5555|   14470.0000|2014-07-14 09:54:12|         
|  5555|   14470.0000|2014-07-14 09:54:12|         
+------------+----------------------+-------------------+ 

Ich versuche, eine Fensterfunktion wie auszuführen:

WindowSpec window = Window.partitionBy(df.col("id")).orderBy(df.col("eventdate").desc()); 
df.select(df.col("*"),rank().over(window).alias("rank")) //error for this line 
     .filter("rank <= 2") 
     .show(); 

Was ich will ist, die letzten zwei Einträge (zuletzt wie für das späteste Datum, aber da es nach Datum absteigend angeordnet ist, die ersten zwei Zeilen) für jeden Benutzer zu erhalten:

+------------+----------------------+-------------------+         
|increment_id|base_subtotal_incl_tax|   eventdate|         
+------------+----------------------+-------------------+         
|  1086|   14470.0000|2016-06-14 09:54:12|         
|  1086|   14470.0000|2016-06-14 09:54:12| 
|  5555|   14470.0000|2014-07-14 09:54:12|         
|  5555|   14470.0000|2014-07-14 09:54:12|          
+------------+----------------------+-------------------+ 

aber ich bekomme diese:

+------------+----------------------+-------------------+----+ 
|increment_id|base_subtotal_incl_tax|   eventdate|rank|        
+------------+----------------------+-------------------+----+        
|  5555|   14470.0000|2014-07-14 09:54:12| 1|        
|  5555|   14470.0000|2014-07-14 09:54:12| 1|        
|  5555|   14470.0000|2014-07-14 09:54:12| 1|        
|  5555|   14470.0000|2014-07-14 09:54:12| 1|        
|  1086|   14470.0000|2016-06-14 09:54:12| 1|        
|  1086|   14470.0000|2016-06-14 09:54:12| 1|        
+------------+----------------------+-------------------+----+ 

Was bin ich?

Antwort

0

Alle Werte sind gleich -> Ränge sind gleich. Versuchen Sie row_number:

df.select(df.col("*"),row_number().over(window).alias("rank")) 
    .filter("rank <= 2") 
    .show(); 
+0

Vielen Dank! Das funktioniert perfekt! Es scheint also, dass das Original auch für reale Daten funktionieren würde, denn die Zeitstempel wären anders. :) –

Verwandte Themen