2017-06-23 38 views
0

我有以下格式的行,然后我想将其转换为有效的Hive时间戳。格式在我的数据:使用第一个unix_timestamp转换列中的每一行

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_unixtimeunix_timestamp

我做出以下假设:

  1. 我可以对日期和年份重新排序。如果这不是真的,我不知道如何将我的原始数据转换为适当的Hive格式
  2. 当我这样做时,它会影响整个列。进一步说,成功完成后,我应该能够将整列的格式从字符串更改为时间戳(也许我必须为此创建一个新列,不确定)

我不在乎这两个列一次,但现在当我查询显示首先我得到尽可能多的空值,因为数据有我的表,并且我不确定我的假设甚至是部分正确的,因为我遇到的每个示例都更简单(它们不会更改例如几天和几年)。

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

在此先感谢。

编辑:我现在想的东西像

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

但我从HUE收到以下错误:

Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 

回答

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) 
+0

我看看......是否可以申请该查询列中的所有数据,时间戳?这个想法最后有数据作为时间戳,这是可能的吗?也许这就是为什么查询不能让我失望 –

+0

这对我来说非常有帮助,因为我一直在寻找投射方式。但是,如果不是只有一行,我有2000,是否可以将该操作应用于整列?例如,如果'28/04/2017 00:00:00'列在“日期”列中,那么您如何才能将此操作应用到该列中的每一行?可能吗? –

+1

超越它是可能的。标量函数适用于表达式。为什么硬编码表达式和列名称之间会有区别?为什么查询2000行的表与查询单个表的“表”有什么区别? –

相关问题