我想将'2015-05-09t09:00:12.123462000'格式的日期转换为配置单元中的unix时间戳。unix\u时间戳('2015-05-09t09:00:12.123462000')不起作用。我不知道怎样才能转换这个。我需要这个来比较两个不同格式的日期。我正在将这两个日期转换为unix时间戳,但失败了。有人能帮忙吗。谢谢
t5fffqht1#
如果可用,您可以简单地使用以下语法1) 检查您的配置单元安装中是否有可用的UDF?
show functions;
2) 如果从\u unixtime()函数中看到,则:
from_unixtime(your_timestamp_field)
这将解决问题!请添加评论,如果你喜欢我的答案!
0yg35tkg2#
萨姆森·沙尔夫里希特的回答是正确的,应该被接受。我只想添加一些关于java.time类型的词。
time类取代了旧的遗留日期时间类,例如 java.sql.Timestamp .这个 Instant 类表示时间线上的一个时刻(utc),分辨率为纳秒(最多九(9)位小数)。您的输入字符串符合iso 8601标准。在解析/生成表示日期时间值的字符串时,java.time类默认使用iso8601格式。所以不需要指定格式化模式。可以直接将字符串解析为 Instant 对象。输入字符串缺少与utc或时区的偏移指示。如果计划使用utc格式,请附加 Z 为了 Zulu 意思是utc。
java.sql.Timestamp
Instant
Z
Zulu
Instant instant = Instant.parse( "2015-05-09T09:00:12.123462000" + "Z" );
您只需调用 toString . 使用的默认格式设置程序 toString 根据需要按三位数一组打印小数。在本例中,最后三位数字为零,因此省略。
toString
String output = instant.toString();
2015-05-09t09:00:12.123462z要将其转换为配置单元所期望的sql样式字符串,请替换 T 并移除 Z .
T
String inputForHive = output.replace( "T" , " " ).replace( "Z" , "" );
2015-05-09 09:00:12.123462
配置单元还提供以下转换:整数从1970 utc开始的unix/posix纪元算起的整秒数( 1970-01-01T00:00:00Z ).浮点数与上述相同,但分秒分辨率高达纳秒。第二个我建议你避免。浮点类型,例如 float , Float , double ,和 Double 在java中,为了更快的执行时间,有目的地牺牲准确性。这通常会导致小数点后面出现多余的数字。如果需要分数秒,请使用字符串类型& Instant 对象。第一个可以很容易地从 Instant 打电话给 getEpochSecond 方法。当然,这意味着数据丢失,因为这种方法会留下任何分数秒。
1970-01-01T00:00:00Z
float
Float
double
Double
getEpochSecond
long secondsSinceEpoch = instant.getEpochSecond();
往另一个方向走。
Instant instant = Instant.ofEpochSecond( secondsSinceEpoch );
一旦你有了 Instant 对象,可以与 compareTo , equals , isBefore , isAfter .
compareTo
equals
isBefore
isAfter
Boolean happenedBefore = thisInstant.isBefore( thatInstant );
java.time框架内置于Java8及更高版本中。这些类取代了诸如 java.util.Date , .Calendar , & java.text.SimpleDateFormat .现在处于维护模式的joda time项目建议迁移到java.time。要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。大部分java.time功能都是通过threeten backport向后移植到Java6和Java7,并通过threetenabp进一步适应android(请参阅如何使用…)。threeten额外的项目用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,等等。
java.util.Date
.Calendar
java.text.SimpleDateFormat
Interval
YearWeek
YearQuarter
jvidinwx3#
您的输入使用完整的ISO8601格式,日期和时间之间有一个“t”和小数秒。hive需要sql格式(即日期和时间之间有空格),如中所示 java.sql.Timestamp 以及odbc,有或没有分秒,如hive文档中所述。只需应用一些非常基本的字符串按摩-然后“投”的 String 去 hive Timestamp . 请忘记往返unix的时间戳:
String
Timestamp
cast(regexp_replace('2015-05-09T09:00:12.123462000', 'T',' ') as Timestamp)
3条答案
按热度按时间t5fffqht1#
如果可用,您可以简单地使用以下语法
1) 检查您的配置单元安装中是否有可用的UDF?
2) 如果从\u unixtime()函数中看到,则:
这将解决问题!
请添加评论,如果你喜欢我的答案!
0yg35tkg2#
萨姆森·沙尔夫里希特的回答是正确的,应该被接受。我只想添加一些关于java.time类型的词。
在字符串之间转换↔ java.time.instant文件
time类取代了旧的遗留日期时间类,例如
java.sql.Timestamp
.这个
Instant
类表示时间线上的一个时刻(utc),分辨率为纳秒(最多九(9)位小数)。您的输入字符串符合iso 8601标准。在解析/生成表示日期时间值的字符串时,java.time类默认使用iso8601格式。所以不需要指定格式化模式。可以直接将字符串解析为
Instant
对象。输入字符串缺少与utc或时区的偏移指示。如果计划使用utc格式,请附加
Z
为了Zulu
意思是utc。您只需调用
toString
. 使用的默认格式设置程序toString
根据需要按三位数一组打印小数。在本例中,最后三位数字为零,因此省略。2015-05-09t09:00:12.123462z
要将其转换为配置单元所期望的sql样式字符串,请替换
T
并移除Z
.2015-05-09 09:00:12.123462
从数字转换
配置单元还提供以下转换:
整数
从1970 utc开始的unix/posix纪元算起的整秒数(
1970-01-01T00:00:00Z
).浮点数
与上述相同,但分秒分辨率高达纳秒。
第二个我建议你避免。浮点类型,例如
float
,Float
,double
,和Double
在java中,为了更快的执行时间,有目的地牺牲准确性。这通常会导致小数点后面出现多余的数字。如果需要分数秒,请使用字符串类型&Instant
对象。第一个可以很容易地从
Instant
打电话给getEpochSecond
方法。当然,这意味着数据丢失,因为这种方法会留下任何分数秒。往另一个方向走。
比较
一旦你有了
Instant
对象,可以与compareTo
,equals
,isBefore
,isAfter
.关于java.time
java.time框架内置于Java8及更高版本中。这些类取代了诸如
java.util.Date
,.Calendar
, &java.text.SimpleDateFormat
.现在处于维护模式的joda time项目建议迁移到java.time。
要了解更多信息,请参阅oracle教程。和搜索堆栈溢出的许多例子和解释。
大部分java.time功能都是通过threeten backport向后移植到Java6和Java7,并通过threetenabp进一步适应android(请参阅如何使用…)。
threeten额外的项目用额外的类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如
Interval
,YearWeek
,YearQuarter
,等等。jvidinwx3#
您的输入使用完整的ISO8601格式,日期和时间之间有一个“t”和小数秒。hive需要sql格式(即日期和时间之间有空格),如中所示
java.sql.Timestamp
以及odbc,有或没有分秒,如hive文档中所述。只需应用一些非常基本的字符串按摩-然后“投”的
String
去 hiveTimestamp
. 请忘记往返unix的时间戳: