unix\u timestamp函数在配置单元中将2位格式的年转换为4位格式的年的逻辑是什么?

o0lyfsai  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(500)

例如,下面的配置单元脚本

select 
from_unixtime(unix_timestamp('30-Apr-50', 'dd-MMM-yy'), 'yyyy-MM-dd') as date1,
from_unixtime(unix_timestamp('30-Apr-45', 'dd-MMM-yy'), 'yyyy-MM-dd') as date2,
from_unixtime(unix_timestamp('30-Apr-35', 'dd-MMM-yy'), 'yyyy-MM-dd') as date3;

结果如下

date1       date2       date3
1950-04-30  1945-04-30  2035-04-30

unix\u timestamp函数将2位数的年份转换为4位数的年份,其背后的逻辑是什么?当2位数年份转换为20**时,是否有固定的阈值?如果有,门槛是多少?是否有一种参数(“世纪之交”作为真实情况)我们可以根据某种条件设置世纪?

jogvjijk

jogvjijk1#

年份:。。。
对于使用缩写年模式(“y”或“yy”)进行解析,simpledateformat必须解释相对于某个世纪的缩写年。
它通过将日期调整为在SimpleDataFormat示例创建之前80年和之后20年内来实现这一点。
例如,使用“mm/dd/yy”模式和1997年1月1日创建的SimpleDataFormat示例,字符串“01/11/12”将被解释为2012年1月11日,而字符串“05/04/64”将被解释为1964年5月4日。
简化格式

hive> select current_date;
2017-03-28

-- 20 years after today

hive> select from_unixtime(unix_timestamp('37-03-28','yy-MM-dd'));
2037-03-28 00:00:00

hive> select from_unixtime(unix_timestamp('37-03-29','yy-MM-dd'));
1937-03-29 00:00:00

-- 80 years before today

hive> select from_unixtime(unix_timestamp('37-03-29','yy-MM-dd'));
1937-03-29 00:00:00

hive> select from_unixtime(unix_timestamp('37-03-28','yy-MM-dd'));
2037-03-28 00:00:00

代码遍历

hive/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/genericudfunixtimestamp.java

public class GenericUDFUnixTimeStamp extends GenericUDFToUnixTimeStamp {
...

public Object evaluate(DeferredObject[] arguments) throws HiveException {
    return (arguments.length == 0) ? currentTimestamp : super.evaluate(arguments);
  }

hive/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/genericftounixtimestamp.java

import java.text.SimpleDateFormat;
...

public class GenericUDFToUnixTimeStamp extends GenericUDF {
...
  private transient final SimpleDateFormat formatter = new SimpleDateFormat(lasPattern);
...
  public Object evaluate(DeferredObject[] arguments) throws HiveException {
...
        retValue.set(formatter.parse(textVal).getTime() / 1000);
...
  }
}

相关问题