Итак, у меня есть две внешние таблицы в Hive, в моем кластере Hadoop.
В одной таблице есть столбец (STRING) с этим форматом '2019-05-24 11:16:31.0'
А другой имеет столбец (дата STRING), в этом формате '23/May/2019:22:15:04'
они оба являются строками. Мне нужно преобразовать их в формат даты того же типа и использовать их для объединения этих двух таблиц.
Как бы вы подошли к решению этой проблемы, решая все проблемы в улье? Было бы возможно? Я довольно новичок в Hadoop, и я не до конца осознаю возможности ВИЧ.
PS: Моя версия куста не поддерживает команду! Hive --version, чтобы проверить, с какой версией я работаю, поэтому я не совсем уверен, как понять, над какой версией я работаю. Не мой кластер и я не пользователь root.
2 ответа
Вы должны преобразовать обе строки в один и тот же формат перед присоединением.
Преобразование нестандартного формата '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 (по состоянию на Hive 1.2.0):
select date_format('2019-05-24 11:16:31.0','yyyy-MM-dd')
Хорошо, вы можете использовать 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])
Я проясняю?
Новые вопросы
date
Дата - это ссылка на определенный день, представленный в календарной системе, и состоит из года, месяца и дня.