将 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" );
你可以生成这样的字符串,只需调用toString
。 toString
使用的默认格式化程序根据需要以三位数字为一组打印小数部分。在此示例中,最后三位数字为零,因此将其省略。
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 还提供来自以下的转换:
第二个我建议你避免。 Java 中的 floating-point 类型,例如 float
、Float
、double
和 Double
有意牺牲准确性以换取更快的执行时间。这通常会导致小数部分末尾出现多余的数字。如果您需要小数秒,请坚持使用字符串类型和 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=]
如果您喜欢我的回答,请添加评论!
我想将 '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.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" );
你可以生成这样的字符串,只需调用toString
。 toString
使用的默认格式化程序根据需要以三位数字为一组打印小数部分。在此示例中,最后三位数字为零,因此将其省略。
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 还提供来自以下的转换:
第二个我建议你避免。 Java 中的 floating-point 类型,例如 float
、Float
、double
和 Double
有意牺牲准确性以换取更快的执行时间。这通常会导致小数部分末尾出现多余的数字。如果您需要小数秒,请坚持使用字符串类型和 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
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=]
如果您喜欢我的回答,请添加评论!