Apache Hive中的Unix_timestamp

时间:2014-01-28 15:47:49

标签: java date time hive hiveql

我正在尝试转换字符串日期“Sat Jan 25 00:13:31 +0000 2014” 使用unix_timestamp()HiveQL函数到Unix时间戳。

  

将给定模式的时间字符串转换为Unix时间戳(以秒为单位),   如果失败则返回0:unix_timestamp('2009-03-20','yyyy-MM-dd')= 1237532400

     

Java Doc   http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html#month

Hive中的

unix_timestamp(“Jan-2014”,“MMM-yyyy”)返回NULL

该函数似乎仅适用于以整数表示的月份(即MM)。 溶液

3 个答案:

答案 0 :(得分:0)

看起来令人难以置信,但除了1月(1月)以外的其他几个月它都有效......

unix_timestamp('Feb 1 18:41:57 +0000 2014','MMM dd HH:mm:ss Z yyyy')
==> 1391280117

星期几的EEE模式不起作用......

答案 1 :(得分:0)

解决了,问题是我的linux系统的本地化。

答案 2 :(得分:0)

使用java.time

在Java端,使用java.time类进行解析。 YearMonth类代表一年零一个月。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMM-yyyy" );
YearMonth ym = YearMonth.parse( "Jan-2014" , f );

我们可以从那个月的第一天获得LocalDate

LocalDate today = ym.atDay( 1 );

如果您想要Hive的仅限日期值,则需要以标准SQL格式提供字符串。对于仅日期值,SQL格式与ISO 8601格式一致。在解析或生成字符串时,java.time类默认使用标准的ISO 8601格式。

String output = today.toString(); // YYYY-MM-DD format per ISO 8601 standard.

从那里你显然想要一个日期时间值。我们可以任意分配当天的第一时刻。日期和确定第一时刻的含义取决于时区。在任何特定时刻,日期和时间在全球各个时区都有所不同。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = today.atStartOfDay( z );

从那以后,您可以生成从1970年开始的UTC时代(1970-01-01T00:00:00Z)以来的整个秒数,以便提供给Hive。

long secondsSinceEpoch = zdt.toEpochSecond();
  

1388534400

走另一个方向,你需要通过Instant课程。 Instant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位数字)。

Instant instant = Instant.ofEpochSecond( 1_388_534_400L );

如果要查看某个地区的wall-clock time,请应用时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。

大部分java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并进一步适应Android中的ThreeTenABP(见How to use…)。

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore