Как выбрать строки с помощью функции Window? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующий DataFrame df в Spark:

+------------+---------+-----------+
|OrderID     |     Type|        Qty|
+------------+---------+-----------+
|      571936|    62800|          1|
|      571936|    62800|          1|
|      571936|    62802|          3|
|      661455|    72800|          1|
|      661455|    72801|          1|

Мне нужно выбрать строку, имеющую наибольшее значение Qty для каждого уникального OrderID или последние строки для OrderID, если все Qty совпадают (например, как для 661455). Ожидаемый результат:

+------------+---------+-----------+
|OrderID     |     Type|        Qty|
+------------+---------+-----------+
|      571936|    62802|          3|
|      661455|    72801|          1|

Любые иды, как его получить?

Вот что я попробовал:

val partitionWindow = Window.partitionBy(col("OrderID")).orderBy(col("Qty").asc)
val result = df.over(partitionWindow)

1 Ответ

0 голосов
/ 21 июня 2019
scala> val w = Window.partitionBy("OrderID").orderBy("Qty")
scala> val w1 = Window.partitionBy("OrderID")

scala> df.show()
+-------+-----+---+
|OrderID| Type|Qty|
+-------+-----+---+
| 571936|62800|  1|
| 571936|62800|  1|
| 571936|62802|  3|
| 661455|72800|  1|
| 661455|72801|  1|
+-------+-----+---+


scala> df.withColumn("rn",  row_number.over(w)).withColumn("mxrn", max("rn").over(w1)).filter($"mxrn" === $"rn").drop("mxrn","rn").show
+-------+-----+---+
|OrderID| Type|Qty|
+-------+-----+---+
| 661455|72801|  1|
| 571936|62802|  3|
+-------+-----+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...