hive unix_timestamp格式说明
| 分类: 大数据 |
1. 使用unix_timestamp函数结果如下
hive> select to_unix_timestamp("20171218 15:55:37","yyyymmdd hh:mm:ss");
OK
1484726137
Time taken: 0.166 seconds, Fetched: 1 row(s)
hive>
2. 使用from_unixtime计算unix时间(单位s)的日期时间格式
hive> select from_unixtime(1484726137);
OK
2017-01-18 15:55:37
Time taken: 0.148 seconds, Fetched: 1 row(s)
hive>
3.比对结果中发现1的时间戳值倒过来计算时间的值不对应,这时认为函数有问题
4. 查看show
functions中的所有函数中发现unix_timestamp有2个类似的:unix_timestamp和to_unix_timestamp
5.再次使用unix_timestamp计算的结果依然如此
hive> select unix_timestamp("20171218 15:55:37","yyyymmdd
hh:mm:ss");
OK
1484726137
Time taken: 0.166 seconds, Fetched: 1 row(s)
6.于是百度了下其他博友写的博客仔细核对了时间格式发现在年月日中的月mm应该写成MM,修改结果再次运行没有问题
注:在使用unix_timestamp函数时千万注意月份的格式是大写MM,否则计算出的结果有影响。
目前不知道小写mm的月份代表什么,测试的时候不管月份是什么,小写mm的结果都是01月份;
在继续研究中发现了函数是根据格式符取年月日时分秒的值,没有对应时间上的匹配符就含有默认的值。总结如下:
。没有对应的格式符,含有默认值。年份(yyyy)-----1970年;月份(MM)----》01;日(dd)---》01;时---》00;分---》00;秒---》00
图一
。对应的格式符含有多个,解析最后一个,例如:"2017-12-20 12:20:03 yyyy-MM-dd
hh:mm:hh",即hh有2个值,12、03,而ss没有默认为0,最后得到的结果是2017-12-20 03:20:00
。月日时分秒对应的字符大于2且连续,将对应字符的值做为整体解析。例如"20171220 122003 yyyy-MM-dd
hh:hh:ss",即hh:hh连续在一起,任务12和20合并一起为1220小时,然后将1220h/24=50天20小时,即将20171220+50天=20180208,剩余的20小时作为时,mm没有格式符,即00,结果为:2018-02-28
20:00:03
图2
。 年份格式符若写yy时的解析为:yy>37 =》 19yy年;yy<37 =》20yy年,例如"171220
132003, yyyyMMdd hh:mm:ss"=》2017-12-20
13:20:03
unix时间的定义见相关博客:http://jm.ncxyol.com/post-88.html
图3
技术扩展:hive更多函数请参考官网地址https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

加载中…