所以我在Hadoop集群中的Hive中有两个外部表。
一个表具有(日期STRING)列,其格式为'2019-05-24 11:16:31.0'
,另一个具有(date STRING)列,格式为'23/May/2019:22:15:04'
,它们都是字符串。我需要将它们转换为相同类型的日期格式,并使用它们来连接这两个表。
您如何在蜂巢中解决这个问题?这有没有可能?我是Hadoop的新秀,而且我还没有完全意识到配置单元的可能性。
Ps:我的蜂巢版本不支持!hive --version命令来检查我正在使用的版本,因此我不太确定如何了解我正在使用的版本。不是我的集群,我不是root用户。
答案 0 :(得分:0)
好的,您可以在配置单元中使用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 :(得分:0)
在加入之前,您需要将两个字符串转换为相同的格式。
转换非标准格式'23/May/2019:22:15:04'
使用unix_timestamp(string date, string pattern)
将给定的date format转换为从1970-01-01开始的秒数。然后使用f rom_unixtime()
转换为required format:
select from_unixtime(unix_timestamp('23/May/2019:22:15:04','dd/MMM/yyyy:HH:mm:ss'));
返回:
2019-05-23 22:15:04
如果仅需要日期,请在from_unixtime函数中指定日期格式'yyyy-MM-dd'
:
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')