как конвертировать метку времени в секундах в улье - PullRequest
1 голос
/ 11 октября 2019

Я ищу решение для моей проблемы. Моя проблема в том, что я хочу преобразовать свои данные в секунды. Данные в моей таблице HIVE выглядят ниже:

Мой ввод:

1 Day 8 Hours 48 Minutes    
1 Hour 1 Minutes    
3 Hours 
20 Minutes
20 Minutes 4 Seconds
50 Seconds 

Мой ожидаемый результат в сек

118080
3660
10800
1200
1204
50

1 Ответ

1 голос
/ 11 октября 2019

Используя регулярные выражения, вы можете анализировать все возможные шаблоны в выписке. Может быть, это можно оптимизировать, надеюсь, у вас есть идея. Добавьте больше шаблонов и протестируйте их следующим образом:

with mytable as(
select stack(6,
'1 Day 8 Hours 48 Minutes',    
'1 Hour 1 Minutes',   
'3 Hours', 
'20 Minutes',
'20 Minutes 4 Seconds',
'50 Seconds' 
) as mytimestamp 
)


select mytimestamp, ts[0]*86400  --days
                   +ts[1]*3600   --hours
                   +ts[2]*60     --minutes
                   +ts[3]        --seconds 
                   as seconds
from 
(
select mytimestamp, 
       split(
        case when mytimestamp rlike '^(\\d{1,2})\\s(?:Days?)\\s(\\d{1,2})\\s(?:Hours?)\\s(\\d{1,2})\\s(?:Minutes?)$'                            --Days Hours Minutes
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Days?)\\s(\\d{1,2})\\s(?:Hours?)\\s(\\d{1,2})\\s(?:Minutes?)$','$1:$2:$3:0')

            when mytimestamp rlike '^(\\d{1,2})\\s(?:Hours?)\\s(\\d{1,2})\\s(?:Minutes?)$'                                                     --Hours Minutes
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Hours?)\\s(\\d{1,2})\\s(?:Minutes?)$','0:$1:$2:0')

            when mytimestamp rlike '^(\\d{1,2})\\s(?:Hours?)$'                                                                                 --Hours
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Hours?)$','0:$1:0:0')

            when mytimestamp rlike '^(\\d{1,2})\\s(?:Minutes?)$'                                                                               --Minutes
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Minutes?)$','0:0:$1:0')

            when mytimestamp rlike '^(\\d{1,2})\\s(?:Minutes?)\\s(\\d{1,2})\\s(?:Seconds?)$'                                                   --Minutes Seconds
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Minutes?)\\s(\\d{1,2})\\s(?:Seconds?)$','0:0:$1:$2') 

            when mytimestamp rlike '^(\\d{1,2})\\s(?:Seconds?)$'                                                                               --Seconds
                 then regexp_replace(mytimestamp,'^(\\d{1,2})\\s(?:Seconds?)$','0:0:0:$1')
         end,':') as ts
    from mytable
)s

Возвращает:

mytimestamp                seconds  
1 Day 8 Hours 48 Minutes    118080  
1 Hour 1 Minutes            3660    
3 Hours                     10800   
20 Minutes                  1200    
20 Minutes 4 Seconds        1204    
50 Seconds                  50  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...