Чтение странного формата даты в улье

#date #hive #apache-spark-sql #format

Вопрос:

У меня есть столбец, который содержит дату как строку, но во многих форматах, таких как — dd/MM/yy , dd/MMM/yyy .. и т. Д. и т. Д. И я использую следующий код для преобразования всех строк в один определенный формат даты ( yyyy-MM-dd ) в hive :

 select 
      from_unixtime(unix_timestamp('31/02/2021','dd/MM/yyyy'),'yyyy-MM-dd')
 

но это дает мне 2021-03-03 в УЛЬЕ.

Есть ли какой-либо другой способ идентифицировать такие недопустимые даты и указать null.

Ответ №1:

Предположим, вы правильно распознали формат, и это точно «дд/ММ/гггг», а дата недопустима «31/02/2021».

функция unix_timestamp в таком случае перенесет дату на следующий месяц, и изменить ее поведение невозможно. Но вы можете проверить, совпадает ли дата, дважды преобразованная из исходной строки в метку времени и обратно в исходный формат. В случае, если это не одно и то же, то дата является недействительной.

     case 
        -- check double-converted date is the same as original string
        when from_unixtime(unix_timestamp(date_col,'dd/MM/yyyy'),'dd/MM/yyyy') = date_col
            --convert to yyyy-MM-dd if the date is valid
            then from_unixtime(unix_timestamp('31/02/2021','dd/MM/yyyy'),'yyyy-MM-dd')
        else null  -- null if invalid date
     end as date_converted