PySpark получает значение столбца фрейма данных с максимальной датой

#pyspark

Вопрос:

Мне нужно создать новый столбец в фрейме данных pyspark, используя значение столбца из строки максимальной даты над окном. Учитывая приведенный ниже фрейм данных, мне нужно установить новый столбец с именем max_adj_factor для каждой записи для каждого актива на основе коэффициента корректировки на самую последнюю дату.

  ---------------- ------- ---------- ----- 
|adjustmentFactor|assetId|      date|  nav|
 ---------------- ------- ---------- ----- 
|9.96288362069999|4000123|2019-12-20| 18.5|
|9.96288362069999|4000123|2019-12-23|18.67|
|9.96288362069999|4000123|2019-12-24| 18.6|
|9.96288362069999|4000123|2019-12-26|18.57|
|10.0449181987999|4000123|2019-12-27|18.46|
|10.0449181987999|4000123|2019-12-30|18.41|
|10.0449181987999|4000123|2019-12-31|18.34|
|10.0449181987999|4000123|2020-01-02|18.77|
|10.0449181987999|4000123|2020-01-03|19.07|
|10.0449181987999|4000123|2020-01-06|19.16|
|10.0449181987999|4000123|2020-01-07| 19.2|
 

Комментарии:

1. каков ваш ожидаемый результат?

Ответ №1:

Вы можете использовать max_by над окном:

 df.withColumn("max_adj_factor", 
        F.expr("max_by(adjustmentFactor, date)") 
        .over(Window.partitionBy("assetId"))) 
        .show()
 

Выход:

  ---------------- ------- ---------- ----- ---------------- 
|adjustmentFactor|assetId|      date|  nav|  max_adj_factor|
 ---------------- ------- ---------- ----- ---------------- 
|9.96288362069999|4000123|2019-12-20| 18.5|10.0449181987999|
|9.96288362069999|4000123|2019-12-23|18.67|10.0449181987999|
|9.96288362069999|4000123|2019-12-24| 18.6|10.0449181987999|
|9.96288362069999|4000123|2019-12-26|18.57|10.0449181987999|
|10.0449181987999|4000123|2019-12-27|18.46|10.0449181987999|
|10.0449181987999|4000123|2019-12-30|18.41|10.0449181987999|
|10.0449181987999|4000123|2019-12-31|18.34|10.0449181987999|
|10.0449181987999|4000123|2020-01-02|18.77|10.0449181987999|
|10.0449181987999|4000123|2020-01-03|19.07|10.0449181987999|
|10.0449181987999|4000123|2020-01-06|19.16|10.0449181987999|
|10.0449181987999|4000123|2020-01-07| 19.2|10.0449181987999|
 ---------------- ------- ---------- ----- ----------------