Как переформатировать несколько разных дат в Импала / Улей - PullRequest
1 голос
/ 11 мая 2019

В таблице указаны даты, сохраненные в различном формате. Э.Г.

19/Jun/1965     
30-Jun-1980
29-Mar-1970
Jun-12-1969

Я хочу, чтобы все они были сохранены в одном формате. Я пробовал случай, когда подход разбить его на подмножества и решить каждый человек

select birthdate, 
case 
when birthdate like '%-%' then cast(unix_timestamp(birthdate, 'dd-MMM-yyyy') as timestamp) 
when birthdate like '%/%' then cast(unix_timestamp(birthdate, 'dd/MMM/yyyy') as timestamp) 
end from patientinfo;

Но это, вероятно, приведет к нескольким вложенным запросам case-case.

Есть ли лучший подход, как преобразовать все данные в один и тот же формат даты?

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Да, вы можете.

Вы можете написать свою собственную функцию UDF, которая выполняет что-то вроде this .Вам нужно пройтись по всем возможным форматам и попытаться проверить данные по каждому формату.В случае недействительности верните сообщение или значение по умолчанию, например «1000-01-01».

Здесь вы можете увидеть , как создавать функции UDF.

Удачи!

0 голосов
/ 21 мая 2019

Как отметил Ф. Лазареску, вы можете сделать это, используя «внешние» инструменты в качестве 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;

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...