将 2015-05-09T09:00:12.123462000 中的日期转换为配置单元中的 unix 时间戳

convert date in 2015-05-09T09:00:12.123462000 to unix timestamp in hive

我想将 '2015-05-09T09:00:12.123462000' 格式的日期转换为配置单元中的 unix 时间戳。 UNIX_TIMESTAMP('2015-05-09T09:00:12.123462000') 不起作用。我不确定如何转换它。我需要这个来比较不同格式的两个日期。我将这两个日期都转换为 unix 时间戳,但这失败了。有人可以帮忙吗。

谢谢

您的输入使用了完整的 ISO 8601 format, with a "T" between date and time, and fractional seconds. Hive expects an SQL format (i.e. with a space between date and time) as seen in java.sql.Timestamp and ODBC, with or without fractional seconds, as stated in the Hive documentation

只需应用一些非常基本的字符串按摩 -- 然后 "cast" String 到 Hive Timestamp。请忘记往返于 UNIX_TIMESTAMP:

的蹩脚往返
cast(regexp_replace('2015-05-09T09:00:12.123462000', 'T',' ') as Timestamp)

是正确的,应该接受。我将添加一些关于 java.time 类型的词。

字符串之间的转换 ↔ java.time.Instant

java.time 类 取代了麻烦的旧遗留日期时间 类 例如 java.sql.Timestamp.

Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds(最多九 (9) 位小数)。

您输入的字符串符合 ISO 8601 标准。 java.time 类 在 parsing/generating 表示日期时间值的字符串时默认使用 ISO 8601 格式。因此无需指定格式化模式。您可以直接将字符串解析为 Instant 对象。

您输入的字符串缺少与 UTC 或时区的偏移指示。如果它打算使用 UTC,请为 Zulu 添加一个 Z,这意味着 UTC。

Instant instant = Instant.parse( "2015-05-09T09:00:12.123462000" + "Z" );

你可以生成这样的字符串,只需调用toStringtoString 使用的默认格式化程序根据需要以三位数字为一组打印小数部分。在此示例中,最后三位数字为零,因此将其省略。

String output = instant.toString(); 

2015-05-09T09:00:12.123462Z

要使其成为 Hive 期望的 SQL 样式字符串,请将 T 替换为 SPACE 并删除 Z.

String inputForHive = output.replace( "T" , " " ).replace( "Z" , "" );

2015-05-09 09:00:12.123462

从数字转换

Hive 还提供来自以下的转换:

  • 整数
    从 1970 年 UTC (1970-01-01T00:00:00Z) 开始的 Unix/Posix epoch 开始的整秒计数。
  • 浮点数
    与上面相同,但在高达纳秒分辨率下有小数秒。

第二个我建议你避免。 Java 中的 floating-point 类型,例如 floatFloatdoubleDouble 有意牺牲准确性以换取更快的执行时间。这通常会导致小数部分末尾出现多余的数字。如果您需要小数秒,请坚持使用字符串类型和 Instant 对象。

第一个可以通过调用 getEpochSecond 方法从 Instant 中轻松获得。当然,这意味着数据丢失,因为此方法会留下任何小数秒。

long secondsSinceEpoch = instant.getEpochSecond();

走向另一个方向。

Instant instant = Instant.ofEpochSecond( secondsSinceEpoch );

比较

获得 Instant 对象后,您可以与 compareTo, equals, isBefore, isAfter.

等方法进行比较
Boolean happenedBefore = thisInstant.isBefore( thatInstant );

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old date-time classes such as java.util.Date, .Calendar, & java.text.SimpleDateFormat.

Joda-Time project, now in maintenance mode,建议迁移到java.time。

要了解更多信息,请参阅 Oracle Tutorial。并在 Stack Overflow 中搜索许多示例和解释。

许多 java.time 功能被反向移植到 ThreeTen-Backport and further adapted to Android in ThreeTenABP (see 中的 Java 6 & 7)。

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

如果可用,您可以简单地使用以下语法

1) 检查您的配置单元安装中是否有哪些 UDF 可用?

show functions;

2) 如果看到 from_unixtime() 函数则:

from_unixtime(your_timestamp_field)

这将解决问题![​​=12=]

如果您喜欢我的回答,请添加评论!