Разбор строк 2-di git year подлежит некоторой относительной интерпретации, которая задокументирована в SimpleDateFormat
документах :
Для анализа с сокращенным шаблоном года ("y" или "yy"), SimpleDateFormat должен интерпретировать сокращенный год относительно некоторого столетия. Это достигается путем корректировки дат в пределах 80 лет до и 20 лет после времени создания экземпляра SimpleDateFormat. Например, используя шаблон «MM / dd / yy» и экземпляр SimpleDateFormat, созданный 1 января 1997 г., строка «01/11/12» будет интерпретироваться как 11 января 2012 г., а строка «05/04 / 64 "будет интерпретироваться как 4 мая 1964 года.
Таким образом, 2043
на расстоянии более 20 лет анализатор использует 1943, как описано.
Вот один подход, который использует UDF, который явно вызывает set2DigitYearStart
для SimpleDateFormat
объекта перед синтаксическим анализом даты (в качестве примера я выбрал 1980):
def parseDate(date: String, pattern: String): Date = {
val format = new SimpleDateFormat(pattern);
val cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1980)
val beginning = cal.getTime();
format.set2DigitYearStart(beginning)
return new Date(format.parse(date).getTime);
}
И затем:
val custom_to_date = udf(parseDate _);
df.withColumn("newdate", custom_to_date($"Date", lit("mm/dd/yy"))).show(false)
+--------+----------+
|Date |newdate |
+--------+----------+
|06/03/35|2035-01-03|
|07/24/40|2040-01-24|
|11/15/43|2043-01-15|
|12/15/12|2012-01-15|
|11/15/20|2020-01-15|
|12/12/22|2022-01-12|
+--------+----------+
Зная ваши данные, вы будете знать, какое значение выбрать для параметра set2DigitYearStart()