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

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

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

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

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

1
brandata 30 Май 2019 в 01:13

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')
2
leftjoin 30 Май 2019 в 07:10

Хорошо, вы можете использовать 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])

Я ясно дал понять?

1
Shawn.X 30 Май 2019 в 02:56