【问题标题】:Date Format Conversion in HiveHive 中的日期格式转换
【发布时间】:2014-10-01 02:58:57
【问题描述】:

我对 sql/hive 很陌生。起初,我使用以下方法将一个 txt 文件加载到 hive 中:

drop table if exists Tran_data;
create table Tran_data(tran_time string, 
resort string, settled double)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
Load data local inpath 'C:\Users\me\Documents\transaction_data.txt' into table Tran_Data;

txt文件中的变量tran_time是这样的:10-APR-2014 15:01。加载此 Tran_data 表后,我尝试将 tran_time 转换为“标准”格式,以便可以使用 tran_time 作为 join 键将此表连接到另一个表。所需的日期格式是“yyyymmdd”。我搜索了网上资源,发现了这个:unix_timestamp(substr(tran_time,1,11),'dd-MMM-yyyy')

所以本质上,我正在这样做:unix_timestamp('10-APR-2014','dd-MMM-yyyy')。但是,输出为“NULL”。

所以我的问题是:如何将日期格式转换为“标准”格式,然后进一步转换为'yyyymmdd'格式?

【问题讨论】:

    标签: date format hive


    【解决方案1】:
    from_unixtime(unix_timestamp('20150101' ,'yyyyMMdd'), 'yyyy-MM-dd') 
    

    【讨论】:

    • 如何处理数据库中已有的日期?前任。 20180201
    • 上述函数仅对有效日期格式有效,但有时我们会得到“MMddyyyy”格式的“00122013”​​,这里没有月份,但有什么方法可以显示为“2013-12-00”,当我尝试使用上述功能时,输出给出差异值。2012-12-12
    【解决方案2】:

    我当前的 Hive 版本:Hive 0.12.0-cdh5.1.5

    我使用以下配置单元日期函数将第一列中的日期时间转换为第二列中的日期。希望这会有所帮助!

    select inp_dt, from_unixtime(unix_timestamp(substr(inp_dt,0,11),'dd-MMM-yyyy')) as todateformat from table;
    

    inp_dt 日期格式
    2015 年 3 月 12 日 07:24:55 2015-03-12 00:00:00

    【讨论】:

      【解决方案3】:

      unix_timestamp 函数会将给定的字符串日期格式转换为以秒为单位的 unix 时间戳,但不像 dd-mm-yyyy 这种格式。

      您需要编写自己的自定义 udf 来将给定的字符串日期转换为您需要的格式,因为目前 Hive 没有任何预定义的函数。我们有 to_date 函数将时间戳转换为 date ,剩下的所有 unix_timestamp 函数对你的问题没有帮助。

      【讨论】:

      • 感谢您的回复。但是我注意到 unix_timestamp('20140501','yyyymmdd') 可以返回不为空的内容。但是, unix_timestamp('01-MAY-2014','dd-mmm-yyyy') 给了我一个“空”。两者的区别在哪里?
      【解决方案4】:
      select from_unixtime(unix_timestamp('01032018' ,'MMddyyyy'), 'yyyyMMdd');
      

      输入格式:mmddyyyy

      01032018

      查询后输出:yyyymmdd

      20180103

      【讨论】:

        【解决方案5】:

        为了将来帮助某人:

        以下功能应该像我的情况一样工作

        to_date(from_unixtime(UNIX_TIMESTAMP('10-APR-2014','dd-MMM-yyyy'))

        【讨论】:

          【解决方案6】:

          unix_timestamp('2014-05-01','dd-mmm-yyyy') 将起作用,您的输入字符串应采用这种格式,用于配置单元 yyyy-mm-dd 或 yyyy-mm-dd hh:mm:ss

          当您尝试使用 '01-MAY-2014' 时,配置单元不会将其理解为日期字符串

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-15
            • 2021-01-16
            • 2015-02-28
            • 2020-11-24
            • 2017-12-23
            相关资源
            最近更新 更多