分享

Hive 日期格式转换问题

 wintelsui 2018-06-26

最近在写Hive SQL需要转换数据中的日期格式:
Tue May 20 22:41:01 CST 2014 转换为: yyyy-MM-dd HH:mm:ss

通过在网上搜索,首先需要通过unix_timestamp()将日期字符串转为时间戳,如下:
unix_timestamp('Tue May 20 22:41:01 CST 2014','EEE MMM dd HH:mm:Ss z yyyy')

但是SQL在我本机的Hive上执行时,没有正确转换:

hive> SELECT unix_timestamp('Tue May 20 22:41:01 CST 2014','EEE MMM dd HH:mm:Ss z yyyy');
OK
NULL
Time taken: 0.044 seconds, Fetched: 1 row(s)

同样的SQL在公司的Hive上执行,结果正常输出:

hive> SELECT unix_timestamp('Tue May 20 22:41:01 CST 2014','EEE MMM dd HH:mm:Ss z yyyy');
OK
1400596861
Time taken: 0.044 seconds, Fetched: 1 row(s)

接着分别在本机、公司机器执行from_unixtime函数

hive> SELECT from_unixtime(111111,'EEE MMM dd HH:mm:Ss z yyyy');
OK
星期五 一月 02 14:51:051 CST 1970
hive> SELECT from_unixtime(111111,'EEE MMM dd HH:mm:Ss z yyyy');
OK
Fri Jan 02 14:51:051 CST 1970
Time taken: 0.063 seconds, Fetched: 1 row(s)

到这里大家是不是看出来问题啦,本机和公司机器的系统默认语言不一样!!!
接下来验证上述的问题是不是因为系统默认语言导致的:
在本机输入如下SQL,结果正常输出,公司机器输出结果为NULL。

hive> SELECT unix_timestamp('星期五 一月 02 14:51:051 CST 1970', 'EEE MMM dd HH:mm:Ss z yyyy');
OK
111111
Time taken: 0.061 seconds, Fetched: 1 row(s)
hive> SELECT unix_timestamp('星期五 一月 02 14:51:051 CST 1970', 'EEE MMM dd HH:mm:Ss z yyyy');
OK
NULL
Time taken: 0.041 seconds, Fetched: 1 row(s)

接着就来分别通过locale命令查看一下两台机器的系统默认语言。
公司:LC_CTYPE=en_US.UTF-8
本机:LC_CTYPE=zh_CN.UTF-8
将本机LC_CTYPE参数修改为en_US.UTF-8,问题解决。
参数含义可以参考Ubuntu官方链接

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多