2017-09-20 17 views
0

我的數據是這樣如何選擇

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 

從這個從一列的多行兩行,我想選擇:

  • 一個turtle和一個rabbit從每組
  • 其中必須具有最少的持續時間在其組

例如:

基於以上數據,結果應該是:

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

我做了什麼:

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

然而,這組數據和我沒有收到預期的效果。

+1

'partitionBy(「種族」,「啓動「)'? – zero323

回答

0

嗨,你應該使用,而不是ROWNUMBER等級,使「種族」,在這裏「開始」列的窗口是代碼片段,將解決你的問題:

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()