hive中如何将13位bigint类型的时间戳的转化为毫秒标准时间格式

16 篇文章 1 订阅
12 篇文章 2 订阅

首先,我们先了解13位时间戳13位的时间戳其实数据的时间单位就是ms。基于此我们来分析问题原因和实现方式。

要点:

13位时间戳因为时间单位为毫秒所以我们可以很容易知道转化成标准毫秒时间格式毫秒部分必然与13位时间戳一致。

举个例子方便大家理解。

bigint(13)1571709884123
毫秒时间标准格式:2019-10-22 10:22:44.123

解决方案:

首选方案:

那么就此我们开始分析我们该如何实现,首先容易想到的就是hive中默认的转换函数FROM_UNIXTIME(unix_timestamp/1000,format)。我们知道unix_timestamp时间戳的精度默认为s,而我们要转为ms所以将unix_timestamp/1000来将单位转换为ms。format我们设置成时间格式'yyyy-MM-dd HH:dd:ss.sss'为毫秒。

SELECT FROM_UNIXTIME(1571709884123/1000,'yyyy-MM-dd HH:dd:ss.sss');

2019-10-22 10:22:44.044

说明:13位的整型除以1000等于时间戳timestamp单位才是毫秒,将时间戳类型转化为日期类型使用from_unixtime
FROM_UNIXTIME(unix_timestamp/1000,format)参数介绍:
unix_timestamp :单位为秒
unix_timestamp/1000:单位为毫秒。
formatyyyy-MM-dd HH:dd:ss.sss(毫秒)、yyyy-MM-dd HH:dd:ss(秒)、yyyy-MM-dd(日期)等

我们发现毫秒值在转换时毫秒部分并不准确。这是什么原因呢?笔者经过调研发现可能为如下原因造成。

原因:Javadate默认精度是毫秒,由date转换成的时间戳是13位的,而c,php生成的时间默认就是10位的,精度是

方案调整:

由于hive本身自带的时间戳转换函数毫秒存在精度问题无法使用,所以我们需要想办法解决毫秒部分的精度问题。由此我们发现只有毫秒部分存在问题而秒及以上的部分是没有问题,所以我们使用FROM_UNIXTIME(unix_timestamp/1000,format)函数并将毫秒部分拼接在from_unixtime函数结果之后。

select
    concat(t,".",substring(1571709884123,11,13))
from(
select from_unixtime(cast(substring(1571709884123,0,10) as bigint),'yyyy-MM-dd HH:dd:ss') as t
)tmp;

执行结果如下:

扩展:

如果想转换成"yyyy-MM-dd HH:dd:ss",需要将13位时间戳转换成11位时间戳,注意转换过程中函数入参数据类型

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地增

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值