В моем кадре данных есть DateId (т.е. целочисленный столбец, определяющий дату как количество дней с 1993-06-25). Цель состоит в том, чтобы вычислить идентификатор даты последнего дня месяца до каждой даты в столбце:
DateId -> _intermittent calc Date_ -> _result LastDayOfPriorMonthId_
9063 -> 2018-04-18 -> 9045 (i.e. 2018-03-31)
8771 -> 2017-06-30 -> 8741 (i.e. 2017-05-31)
9175 -> 2018-08-08 -> 9167 (i.e. 2018-07-31)
Решение было бы очень простым, но у меня возникают проблемы с преобразованием типов:
val a = Seq(9063, 8771, 9175).toDF("DateId")
val timeStart = to_date(lit("1993-06-25"))
val dateIdAdd : (Column) => Column = x => {x - date_add(timeStart, x).DATE_OF_MONTH}
Компиляция функции завершается со следующей ошибкой:
notebook:2: error: type mismatch;
found : org.apache.spark.sql.Column
required: Int
x - date_add(timeStart, x).DATE_OF_MONTH
Такие выражения, как .cast(IntegerType)
, не меняют результат (x
по-прежнему является искровым типом столбца, а .cast(Int)
неприменим.
Обратите внимание: аналогичная проблема была решена в этом ТАК вопрос, но тот же подход терпит неудачу, когда здесь применяется константа timeStart
. Также использование функции было бы предпочтительнее, чем выражение, потому что в одном и том же вычислении используется несколько столбцов с реальными данными.