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

Date 有两个不同的字符串表示两个不同配置单元表中的日期,我想使用它们来连接,date,hadoop,hive,hiveql,Date,Hadoop,Hive,Hiveql,所以我在我的Hadoop集群中的配置单元中有两个外部表 一个表有一个(日期字符串)列,其格式为'2019-05-24 11:16:31.0' 另一个有(日期字符串)列,格式为'23/May/2019:22:15:04',它们都是字符串。我需要将它们转换为相同类型的日期格式,并使用它们连接这两个表 你将如何解决这个问题,在蜂巢内解决所有问题?可能吗?我是Hadoop的新手,我还没有完全意识到hive的可能性 Ps:我的配置单元版本不支持!hive——version命令,用于检查我正在使用的版本,因

所以我在我的Hadoop集群中的配置单元中有两个外部表

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

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

你将如何解决这个问题,在蜂巢内解决所有问题?可能吗?我是Hadoop的新手,我还没有完全意识到hive的可能性


Ps:我的配置单元版本不支持!hive——version命令,用于检查我正在使用的版本,因此我不太确定如何理解我正在使用的版本。不是我的群集,我也不是根用户。

好的,您可以使用配置单元中的
字符串函数和运算符使两种不同的日期格式相同,如下所示:

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  |
+-----------+
然后加入他们,下面是一个简单的例子来说明如何使用,你可以细化细节

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])

我讲清楚了吗?

在加入之前,您需要将两个字符串转换为相同的格式

转换非标准格式
'23/May/2019:22:15:04'

使用
unix\u时间戳(字符串日期、字符串模式)
将给定的时间转换为1970-01-01的秒数。然后使用f
rom\u unixtime()
转换为:

返回:

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
2019-05-24 11:16:31
2019-05-24 11:16:31
第二个表格包含更多标准格式
'2019-05-24 11:16:31.0'
,您可以使用更简单的方法。

您可以使用简单的substr,因为日期已采用配置单元格式
'yyyy-MM-dd'

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

2019-05-23
2019-05-24
2019-05-24 11:16:31
2019-05-24 11:16:31
或者,如果您想要与第一个示例中的格式相同的格式
'yyyy-MM-dd HH:MM:ss'

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

2019-05-23
2019-05-24
2019-05-24 11:16:31
2019-05-24 11:16:31
此外,date_格式(从Hive 1.2.0开始)功能也可用于相同的:

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

2019-05-23
2019-05-24
2019-05-24 11:16:31
2019-05-24 11:16:31
和仅使用日期_格式的日期部分(从Hive 1.2.0开始):


当然,它会被实现,只需使用子字符串。感谢您的帮助,很抱歉延迟,直到今天才能返回到该项目。它起作用了。足够清楚,尽管我发现代码不够直观,所以我没有测试它,leftjoin的第一个解决方案对我起作用。非常感谢你的帮助。