Как отметил Ф. Лазареску, вы можете сделать это, используя «внешние» инструменты в качестве UDF (что может быть проще, если вы привыкли к ним и к таким языкам, как Java или C ++), или вы можете просто использовать регулярные выражения.
Impala предоставляет для этого regexp_extract.Я сделал запрос, который вы могли бы использовать для дат, указанных вами выше.
Если у ваших дат может быть другой синтаксис, вы должны добавить его к возможностям регулярного выражения:
select date_time,
case
when
-- If it starts with a number(day)
regexp_extract(date_time, '^(\\d+).*?', 1)!='' THEN
cast(unix_timestamp(
concat(
regexp_extract(date_time, '^(\\d+).*?', 1),-- Day
'/',
-- Extract and convert the month
case
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Jan' then '01'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Feb' then '02'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Mar' then '03'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Apr' then '04'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='May' then '05'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Jun' then '06'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Jul' then '07'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Aug' then '08'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Sep' then '09'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Oct' then '10'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Nov' then '11'
when
regexp_extract(date_time, '([a-zA-Z]+?)', 1)='Dec' then '12'
else null
end,
'/',
regexp_extract(fecha, '(\\d+)$', 1)
),
'dd/MM/yyyy') as timestamp)
WHEN
-- If it starts with an String (month)
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1) !='' then
cast(unix_timestamp(
concat(
regexp_extract(date_time, '(\\d+)', 1),-- Day
'/',
case
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Jan' then '01'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Feb' then '02'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Mar' then '03'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Apr' then '04'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='May' then '05'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Jun' then '06'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Jul' then '07'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Aug' then '08'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Sep' then '09'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Oct' then '10'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Nov' then '11'
when
regexp_extract(date_time, '^([a-zA-Z]+).*?', 1)='Dec' then '12'
else null
end,
'/',
regexp_extract(date_time, '(\\d+)$', 1)),
'dd/MM/yyyy') as timestamp)
else null
end as converted_datetime
from mytable;
Надеюсь, это поможет.