【问题标题】:Transform every row in a column to date, using first unix_timestamp使用第一个 unix_timestamp 将列中的每一行转换为日期
【发布时间】:2017-06-23 08:01:05
【问题描述】:

我有以下格式的行,我想将其转换为有效的 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_unixtimeunix_timestamp

我做了以下假设:

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

我不关心同时处理两个列,但是现在当我首先执行查询时,我得到的空值与我的表中的数据一样多,而且我不确定我的假设是否部分正确,因为每个示例我come accros 更简单(例如,它们不会改变周围的日子和年份)。

我想知道如何将查询应用于特定列,因为从目前研究的示例中我还不明白如何做到这一点。我没有看到他们使用任何类型的列 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

【问题讨论】:

    标签: hive timestamp unix-timestamp


    【解决方案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)
    

    【讨论】:

    • 我明白了...是否可以将该查询应用于列中的所有数据?最后的想法是将数据作为时间戳,这可能吗?也许这就是为什么查询一直让我失败的原因
    • 这对我真的很有帮助,因为我也在寻找投射它的方法。但是,如果我有 2000 行而不是只有 1 行,是否可以将该操作应用于整个列?例如,如果“28/04/2017 00:00:00”在“日期”列中,您如何将您向我展示的此操作应用于该列中的每一行?有可能吗?
    • 偏离航线是可能的。标量函数适用于表达式。为什么硬编码表达式和列名之间会有任何区别?为什么查询2000行的表和查询单行的“表”会有什么区别?
    • 因为当我使用列名和表切换您的工作示例时,查询失败:S 我正在使用这个,稍微改编自您的示例:select cast (from_unixtime(to_unix_timestamp(f_date, ' dd/MM/yyyy HH:mm:ss')) 作为时间戳) 来自table
    • 如果出现故障,很可能与您的帖子/我的回答无关。如果我的示例“按原样”为您工作,那么为您打开一个新问题并包含完整的堆栈跟踪
    猜你喜欢
    • 2012-04-04
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多