如何从列的多行中选择两行

时间:2017-09-20 13:42:51

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有这样的数据

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 个答案:

答案 0 :(得分:0)

嗨,你应该使用rank而不是rownumber并使#34; race"并且"开始"这里的列是代码片段,它将解决您的问题:

column A | column B | column C
001001     Adam          20   
001002     Adam          1.2
001001     Brian         21   
001002     Brian         1.5
001001     Cameron       25   
001002     Cameron       1.1
001001     Daniel        18   
001002     Daniel        1.8
001001     Edward        19   
001002     Edward        2.3