在 Hive 中将 dd/mm/yyyy/hh/mm/ss 格式更改为 yyyymm

Posted

技术标签:

【中文标题】在 Hive 中将 dd/mm/yyyy/hh/mm/ss 格式更改为 yyyymm【英文标题】:Changing dd/mm/yyyy/ hh/mm/ss format to yyyymm in Hive 【发布时间】:2019-05-24 18:44:17 【问题描述】:

我目前正在使用 Hive。我有一列(A 列)字符串,格式如下11/9/2009 0:00:00。我想提取yyyymm。即我希望上面的字符串是200909。我尝试了两种不同的方法,但都没有奏效。

我尝试使用两种不同的方法转换字符串

       concat(year(Column A),lpad(month(Column A),2,0))


       convert(datetime, Column A)

对于我收到的第一行代码:所有行都为 NULL

对于我收到的第二个:

遇到:预期的 DATETIME:ALL、CASE、CAST、DEFAULT、DISTINCT、 EXISTS、FALSE、IF、INTERVAL、NOT、NULL、REPLACE、TRUNCATE、TRUE、 导致的标识符:异常:语法错误

【问题讨论】:

【参考方案1】:

使用unix_timestamp(string date, string pattern) 将given date format 转换为从1970-01-01 过去的秒数。然后使用 from_unixtime() 转换为required format:

select  from_unixtime(unix_timestamp( '11/9/2009 0:00:00','dd/MM/yyyy HH:mm:ss'), 'yyyyMM');

结果:

200909

另请阅读:Impala data and time functions 和 Hive date functions。

另一种解决方案,适用于 Hive:

select  concat(regexp_extract('11/9/2009 0:00:00','(\\d1,2)/(\\d1,2)/(\\d4)',3),lpad(regexp_extract('11/9/2009 0:00:00','(\\d1,2)/(\\d1,2)/(\\d4)',2),2,0))

【讨论】:

因为它是一个字符串而不是一个日期时间戳,所以上面的内容是行不通的。 @Yags 我无法查看 Impala。这绝对适用于 Hive @leftjoin '11/9/2009 0:00:00','dd/MM/yyyy HH:mm:ss' 这是我数据集中的一个字符串。因此结果为空。在你的哪里是日期时间 第二个工作正常。此外,我的以下解决方案产生相同的输出。谢谢@leftjoin【参考方案2】:

由于我试图将字符串转换为 YYYYMM,因此我必须使用以下对我有用的方法:

      'concat(substr(Column A, instr(Column A, ' ')-4, 4),substr(Column A, instr(Column A, ' /')+1, 2))' 

【讨论】:

以上是关于在 Hive 中将 dd/mm/yyyy/hh/mm/ss 格式更改为 yyyymm的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 中将列名转换为行

Hive 在 HDFS 中将文件存储在哪里?

我们如何在 hive 中将字符串转换为数组?

在 Hive 中将分钟添加到日期时间

无法在 cloudera VM 中将 hive 升级到 2.3.2

在单个实例中将 pig 输出存储到 Hive 表中