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

Hive 将2015-05-09T09:00:12.123462000中的日期转换为配置单元中的unix时间戳,hive,unix-timestamp,to-date,Hive,Unix Timestamp,To Date,我想将'2015-05-09T09:00:12.123462000'格式的日期转换为配置单元中的unix时间戳。UNIX_时间戳(“2015-05-09T09:00:12.123462000”)不起作用。我不知道如何转换这个。我需要这个来比较两个不同格式的日期。我正在将这两个日期转换为unix时间戳,但这失败了。有人能帮忙吗 谢谢您的输入使用完整格式,日期和时间之间有一个“T”和小数秒。Hive需要SQL格式(即日期和时间之间有空格),如和所示,有或没有小数秒,如中所示 只需应用一些非常基本的字

我想将'2015-05-09T09:00:12.123462000'格式的日期转换为配置单元中的unix时间戳。UNIX_时间戳(“2015-05-09T09:00:12.123462000”)不起作用。我不知道如何转换这个。我需要这个来比较两个不同格式的日期。我正在将这两个日期转换为unix时间戳,但这失败了。有人能帮忙吗

谢谢

您的输入使用完整格式,日期和时间之间有一个“T”和小数秒。Hive需要SQL格式(即日期和时间之间有空格),如和所示,有或没有小数秒,如中所示

只需应用一些非常基本的字符串按摩——然后将
字符串“投射”到蜂巢中。请忘记往返UNIX\u的时间戳:

cast(regexp_replace('2015-05-09T09:00:12.123462000', 'T',' ') as Timestamp)
这是正确的,应该被接受。我只想添加一些关于java.time类型的词汇

字符串之间的转换↔ <代码>java.time.Instant
这些类取代了麻烦的旧遗留日期时间类,如
java.sql.Timestamp

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

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

您的输入字符串缺少与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

要将其转换为配置单元期望的SQL样式字符串,请将
T
替换为空格,然后删除
Z

String inputForHive = output.replace( "T" , " " ).replace( "Z" , "" );
2015-05-09 09:00:12.123462

数字转换 配置单元还提供了以下转换:

  • 从1970 UTC开始的/Posix开始的整秒计数(
    1970-01-01T00:00:00Z
  • 浮点数
    与上面相同,但分辨率为纳秒
第二个我建议你避免。Java中的
float
float
double
、和
double
等类型故意为了更快的执行时间而牺牲准确性。这通常会导致小数点后面出现多余的数字。如果需要小数秒,请使用字符串类型&
Instant
对象

通过调用
getEpochSecond
方法,可以很容易地从
Instant
中获取第一个。当然,这意味着数据丢失,因为这种方法会留下任何分数秒

long secondsSinceEpoch = instant.getEpochSecond();
往另一个方向走

Instant instant = Instant.ofEpochSecond( secondsSinceEpoch );
比较 一旦您拥有了
即时
对象,就可以与、、等方法进行比较

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到java.time

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释

大部分java.time功能都在中向后移植到java 6和7,并进一步适应于中(请参阅)


该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,如、、和。

如果可用,只需使用以下语法即可

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

show functions;
2) 如果从_unixtime()函数中看到,则:

from_unixtime(your_timestamp_field)
这将解决问题


如果你喜欢我的答案,请添加评论

我认为这在很大程度上是离题的。配置单元接口是SQL(某种类型)。这是一个围绕Java类型和Java方法的外壳,没错;但是,无论谁在没有太多上下文的情况下提出一个简短的问题,比如这个问题,都不太可能对配置单元的实现细节感兴趣,或者对您在配置单元之外可以做什么感兴趣。
from_unixtime(your_timestamp_field)