Есть две разные строки, которые представляют даты в двух разных таблицах кустов, и я хочу использовать их для объединения - PullRequest
1 голос
/ 30 мая 2019

Итак, у меня есть две внешние таблицы в Hive, в моем кластере Hadoop.

В одной таблице есть столбец (STRING) даты с этим форматом '2019-05-24 11:16:31.0'

, а в другой -(дата STRING), в этом формате '23/May/2019:22:15:04' они оба являются строками.Мне нужно преобразовать их в формат даты того же типа и использовать их для объединения этих двух таблиц.

Как бы вы подошли к этой проблеме, решая все это в улье?Было бы возможно?Я довольно новичок в Hadoop, и я не полностью осознаю возможности улья.

Ps: Моя версия улья не поддерживает команду! Hive --version, чтобы проверить, на какой версии я работаюс, так что я не совсем уверен, как понять, над какой версией я работаю.Не мой кластер и я не пользователь root.

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Вам необходимо преобразовать обе строки в один и тот же формат перед присоединением.

Преобразование нестандартного формата '23/May/2019:22:15:04'

Используйте unix_timestamp(string date, string pattern) для преобразования заданного формата даты в секунды, переданные с 1970-01-01,Затем используйте f rom_unixtime() для преобразования в требуемый формат :

select from_unixtime(unix_timestamp('23/May/2019:22:15:04','dd/MMM/yyyy:HH:mm:ss'));

возвращает:

2019-05-23 22:15:04

Если вы хотите только дату, укажите формат даты 'yyyy-MM-dd'в функции from_unixtime:

select from_unixtime(unix_timestamp('23/May/2019:22:15:04','dd/MMM/yyyy:HH:mm:ss'),'yyyy-MM-dd');

Возвращает:

2019-05-23

Вторая таблица содержит более стандартный формат '2019-05-24 11:16:31.0', и вы можете сделать это с более простым подходом.

Вы можете использовать простой substr, потому что дата уже в формате Hive 'yyyy-MM-dd':

select substr('2019-05-24 11:16:31.0',1,10);

Возвращает:

2019-05-24

Или, если вы хотите тот же форматкак в первом примере 'yyyy-MM-dd HH:mm:ss':

select substr('2019-05-24 11:16:31.0',1,19);

Возвращает:

2019-05-24 11:16:31

Также для той же функции может использоваться функция date_format (начиная с Hive 1.2.0):

select date_format('2019-05-24 11:16:31.0','yyyy-MM-dd HH:mm:ss');

Возвращает:

2019-05-24 11:16:31

И часть даты только с использованием date_format (по состоянию на Улей 1.2.0):

select date_format('2019-05-24 11:16:31.0','yyyy-MM-dd')
1 голос
/ 30 мая 2019

ОК, вы можете использовать String Functions and Operators в улье, чтобы сделать два разных формата даты одинаковыми, как показано ниже:

select regexp_replace(substring('2019-05-24 11:16:31.0',0,10),'-','') as date;
+-----------+
|   date    |
+-----------+
| 20190524  |
+-----------+

select concat(split(substring_index('23/May/2019:22:15:04',':',1),'/')[2],case when split(substring_index('23/May/2019:22:15:04',':',1),'/')[1]='May' then '05' end,split(substring_index('23/May/2019:22:15:04',':',1),'/')[0]) as date;
+-----------+
|   date    |
+-----------+
| 20190523  |
+-----------+

А затем join их, ниже приведен простой примеруточнить, как использовать, вы можете уточнить детали.

select
    *
from
    table1 t1
join
    table2 t2 regexp_replace(substring(t1.date,0,10),'-','') = select concat(split(substring_index(t2.date,':',1),'/')[2],case when split(substring_index(t2.date,':',1),'/')[1]='May' then '05' end,split(substring_index(t2.date,':',1),'/')[0])

Я разъясню?

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