Запаздывание искры со значением по умолчанию в качестве другого столбца - PullRequest
1 голос
/ 05 апреля 2019

Допустим, у нас есть

|bin | min |  end  | start | 
|1   | 5   | 10    | 
|2   | 12  | 24    | 
|3   | 28  | 36    | 
|4   | 40  | 50    | 
|5   | null| null  | 

Я бы хотел заполнить start как end предыдущего столбца, чтобы получить значения непрерывного бина.Для пропавших я хотел бы заполнить текущие мин вместо.Что касается нулевой строки, я рассматриваю ее отдельно.

То, что дает нам лаг, будет

df.withColumn("start", F.lag(col("end"), 1, ***default_value***).over(orderBy(col("bin"))
|bin | min |  end  | start | 
|1   | 5   | 10    | (5 wanted)
|2   | 12  | 24    | 10
|3   | 28  | 36    | 24
|4   | 40  | 50    | 36
|5   | null| null  | null

Мои вопросы:

1 / Что мы вставим в default_value для задержки, чтобы взять другой столбец текущей строки, в этом случае min

2 / Есть ли способ обработать пустую строку в то же время безотделяя?Я намерен отфильтровать ненулевое значение, выполнить задержку, а затем объединить с пустыми строками.Как будет отличаться ответ, если Null является первым (ячейка 1) или последним (ячейка 5)?

1 Ответ

1 голос
/ 05 апреля 2019

Используйте coalesce, чтобы получить значение столбца для первой строки в группе.

from pyspark.sql import functions as F 
df.withColumn("start", F.coalesce(F.lag(col("end"), 1).over(orderBy(col("bin")),col("min")))

lag в настоящее время не поддерживает параметр ignorenulls, поэтому вам, возможно, придется выделитьnull строк, вычислите столбец start для ненулевых строк и union фреймы данных.

...