2017-09-20 6 views
0

Ich habe Daten wie dieseWie zwei Zeilen aus mehreren Zeilen einer Spalte auszuwählen

ID  | Race | start | duration 
-------|---------| ------| --------- 
234 | 1010 | turtle| 100 
235 | 1010 | turtle| 101 
236 | 1010 | turtle| 99 
237 | 1010 | rabbit| 199 
238 | 1010 | rabbit| 201 
239 | 1010 | rabbit| 85 
240 | 9898 | rabbit| 185 
241 | 9898 | rabbit| 205 
242 | 9898 | rabbit| 505 
243 | 9898 | turtle| 155 
244 | 9898 | turtle| 104 

von diesem würde ich wählen mag:

  • ein turtle und ein rabbit aus jeder Gruppe
  • der eine muss die geringste Dauer in seiner Gruppe haben

Beispiel:

Basierend auf obigen Daten sollten die Ergebnisse sein:

ID  | Race | start | duration 
-------|---------| ------| --------- 
236 | 1010 | turtle| 99 
239 | 1010 | rabbit| 85 
240 | 9898 | rabbit| 185 
244 | 9898 | turtle| 104 

Was ich getan habe:

w = Window().partitionBy("race").orderBy(col("duration").desc()) 
(df 
    .withColumn("rn", rowNumber().over(w)) 
    .where(col("rn") == 1) 
    .select("race", "duration")).show() 

Doch diese Gruppen die Daten und ich bin nicht immer die gewünschten Ergebnisse.

+1

'partitionBy („Rasse“," Start ")"? – zero323

Antwort

0

Hallo Sie Rang statt rownumber und machen das Fenster von „Rasse“ verwendet werden soll und „Start“ Spalten hier ist der Code-Schnipsel, die Ihr Problem lösen:

import pyspark.sql.functions as F 
from pyspark.sql import Window 
df = sqlContext.createDataFrame([[234,1010,'turtle', 100], 
         [235,1010,'turtle', 101], 
         [236,1010,'turtle', 99], 
         [237,1010,'rabbit', 199], 
         [238,1010,'rabbit', 201], 
         [239,1010,'rabbit', 85], 
         [240,9898,'rabbit', 185], 
         [241,9898,'rabbit', 205], 
         [242,9898,'rabbit', 505], 
         [243,9898,'turtle', 155], 
         [244,9898,'turtle', 104] 
         ], ['id', 'race', 'start', 'duration']) 
w1 = Window().partitionBy("race", "start").orderBy(F.col("duration")) 
df.withColumn("rn", F.rank().over(w1)).where(F.col("rn") == 1).select("id", "race", "start", "duration").show() 
Verwandte Themen