使用 first unix_timestamp 将列中的每一行转换为最新
Transform every row in a column to date, using first 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
和 unix_timestamp
我做了以下假设:
- 我可以重新排序日期和年份。如果这不是真的,我不知道如何将我的原始数据转换为正确的 Hive 格式
- 当我这样做时 select,它会影响整个列。此外,成功完成此操作后,我应该能够将整个列的格式从字符串更改为时间戳(也许我必须为此创建一个新列,不确定)
我不关心同时处理两列,但现在当我执行查询时首先显示我得到的空值与数据中的空值一样多table,我不确定我的假设是否均匀部分正确,因为我遇到的每个例子都更简单(例如,它们不会改变周围的日子和年份)。
我想知道如何将查询应用到特定的列,因为到目前为止我还没有理解如何从所研究的示例中做到这一点。我没有看到他们为此使用任何类型的列 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
格式应完全被输入字符串覆盖。
换句话说 -
格式的长度可以等于输入字符串或更短,但不能更长。
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)
我有以下格式的行,然后我想将其转换为有效的 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
和 unix_timestamp
我做了以下假设:
- 我可以重新排序日期和年份。如果这不是真的,我不知道如何将我的原始数据转换为正确的 Hive 格式
- 当我这样做时 select,它会影响整个列。此外,成功完成此操作后,我应该能够将整个列的格式从字符串更改为时间戳(也许我必须为此创建一个新列,不确定)
我不关心同时处理两列,但现在当我执行查询时首先显示我得到的空值与数据中的空值一样多table,我不确定我的假设是否均匀部分正确,因为我遇到的每个例子都更简单(例如,它们不会改变周围的日子和年份)。
我想知道如何将查询应用到特定的列,因为到目前为止我还没有理解如何从所研究的示例中做到这一点。我没有看到他们为此使用任何类型的列 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
格式应完全被输入字符串覆盖。
换句话说 -
格式的长度可以等于输入字符串或更短,但不能更长。
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)