Вопрос по работе с датафреймами, хочу удалить полностью повторяющиеся записи за исключением некоторых полей (дат). Я пытался использовать windowFunction (WindowSpec) как:
val wFromDupl: WindowSpec = Window
.partitionBy(comparateFields: _*)
.orderBy(asc(orderField))
В переменной comparateFields я храню все поля, которые мне нужно проверить (в примере это будут DESC1 и DESC2), чтобы устранить дубликаты, следуя логике, согласно которой, если есть повторяющаяся запись, мы отбрасываем те, у которых более высокая дата.
В переменной orderField я просто сохраняю поле Effective_date.
Поэтому, применяя оконную функцию, я вычисляю временный столбец, назначая наименьшую дату всем дублирующимся записям, а затем фильтрую dataFrame следующим образом:
val dfFinal: DataFrame = dfInicial
.withColumn("w_eff_date", min(col("effective_date")).over(wFromDupl))
.filter(col("effective_date") === col("w_eff_date"))
.drop("w_eff_date")
.distinct()
.withColumn("effective_end_date", lead(orderField, 1, "9999-12-31").over(w))
Для следующего случая он работает правильно:
KEY EFFECTIVE_DATE DESC 1 DESC 2 W_EFF_DATE (tmp)
E2 2000 A B 2000
E2 2001 A B 2000
E2 2002 AA B 2002
Код удалит вторую запись:
E2 2001 A B 2000
Но логика должна применяться для ПОСЛЕДОВАТЕЛЬНЫХ записей (по дате), например, для следующего случая, по мере реализации кода, мы удаляем третью запись (DESC1 и DESC2 одинаковы, а дата min eff 2000) , но мы не хотим этого, потому что у нас есть (по eff_date) запись в середине (2001 AA B), поэтому мы хотим сохранить 3 записи
KEY EFFECTIVE_DATE DESC1 DESC2 W_EFF_DATE (tmp)
E1 2000 A B 2000
E1 2001 AA B 2001
E1 2002 A B 2000
Любые советы по этому поводу? Спасибо вам всем!