使用第一个unix_timestamp将列中的每一行转换为日期

时间:2017-06-23 08:01:06

标签: hive timestamp unix-timestamp

我有以下格式的行,我想将其转换为有效的Hive时间戳。我的数据格式:

28/04/2017 00:00:00|20550|22/05/2017 00:00:00|

我只对第一列和第三列感兴趣,用|分隔,在我的情况下格式是,然后:

dd/MM/yy HH:mm:ss

我发现这不能用作Hive中的时间戳。

我发现自己无法使用类似于:

的查询将所有第一列和第三列转换为正确的格式
select from_unixtime(unix_timestamp('28/04/2017','dd/MM/yy HH:mm:ss'),'yyyy-MM-dd') from `20170428_f_pers_pers`

我正在尝试该查询的不同实例,但由于我无法访问文档(互联网在工作中受到限制),我无法看到如何正确使用这两个函数from_unixtime和{ {1}}

我做了以下假设:

  1. 我可以重新排列日期和年份。如果不是这样,我不知道如何将原始数据转换为适当的Hive格式
  2. 当我选择此选项时,它会影响整个列。此外,在成功完成此操作后,我应该能够将整个列的格式从字符串更改为时间戳(也许我必须为此创建一个新列,不确定)
  3. 我不关心同时执行这两个列,但是现在当我执行查询时首先得到的数据与我的表中的数据一样多,并且我不确定我的假设是否部分正确,因为每个示例我变得越来越简单(例如,它们不会改变日期和年份)。

    我想知道如何将查询应用于特定列,因为我还不知道如何从目前为止研究的示例中做到这一点。我没有看到他们使用任何类型的列ID,这对我来说很奇怪,使用列中的数据来更改列本身。

    提前致谢。

    编辑:我现在正在尝试类似

    的内容
    unix_timestamp

    但我从HUE得到以下错误:

    select from_unixtime(unix_timestamp(f_Date, 'dd/MM/yyyy HH:mm:ss')) from `myTable`
    

1 个答案:

答案 0 :(得分:1)

格式应完全由输入字符串覆盖 换句话说 -
格式的长度可以与输入字符串相等或更短,但不能更长。

28/04/2017 00:00:00
|||||||||||||||||||
dd/MM/yyyy HH:mm:ss
select  from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy HH:mm:ss')) 
  

2017-04-28 00:00:00

28/04/2017 00:00:00
||||||||||
dd/MM/yyyy
select  from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy')) 
  

2017-04-28 00:00:00

可以使用cast

将结果从字符串转换为时间戳
select cast (from_unixtime(to_unix_timestamp('28/04/2017 00:00:00', 'dd/MM/yyyy HH:mm:ss')) as timestamp)