在两个不同的配置单元表中有两个表示日期的不同字符串,我想用它们来联接

时间:2019-05-29 22:13:24

标签: date hadoop hive hiveql

所以我在Hadoop集群中的Hive中有两个外部表。

一个表具有(日期STRING)列,其格式为'2019-05-24 11:16:31.0'

,另一个具有(date STRING)列,格式为'23/May/2019:22:15:04',它们都是字符串。我需要将它们转换为相同类型的日期格式,并使用它们来连接这两个表。

您如何在蜂巢中解决这个问题?这有没有可能?我是Hadoop的新秀,而且我还没有完全意识到配置单元的可能性。

Ps:我的蜂巢版本不支持!hive --version命令来检查我正在使用的版本,因此我不太确定如何了解我正在使用的版本。不是我的集群,我不是root用户。

2 个答案:

答案 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')