Вопрос касается работы с фреймами данных, я хочу удалить полностью дублированные записи, исключая некоторые поля (даты).Я попытался использовать windowFunction (WindowSpec) как:
val wFromDupl: WindowSpec = Window
.partitionBy(comparateFields: _*)
.orderBy(asc(orderField))
В переменной сравненияteFields я храню все поля, которые мне нужно проверить (в примере это были бы DESC1 и DESC2), чтобы исключить дубликаты, следующие заЛогика заключается в том, что при наличии дублирующейся записи мы отбрасываем записи с более высокой датой.
В переменной orderField я просто сохраняю полеffective_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 одинаковы, минимальная дата - 2000), но мы этого не хотим, потому что имеем (по eff_datд) посередине (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
Какой-нибудь совет по этому поводу?Спасибо всем!