最近在写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官方链接
|