在 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的主要内容,如果未能解决你的问题,请参考以下文章