#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