我需要哪个版本的 Hive 在小数秒内具有超过 6 个小数位的时间戳?

Posted

技术标签:

【中文标题】我需要哪个版本的 Hive 在小数秒内具有超过 6 个小数位的时间戳?【英文标题】:What version of Hive do I need to have timestamps with more than 6 decimal places in the fractional seconds? 【发布时间】:2021-02-03 22:31:12 【问题描述】:

我需要使用什么版本的 Hive:

https://cwiki.apache.org/confluence/display/Hive/CAST...FORMAT+with+SQL%3A2016+datetime+formats

它列出了一种将字符串转换为给定格式的时间戳的方法,但它似乎不起作用,并且与此功能相关的 Jira 故事似乎从未发布过。 https://issues.apache.org/jira/browse/HIVE-21575

有人知道吗?

【问题讨论】:

Hive 支持纳秒级精度时间戳,你可以用其他方法转换,看我的回答 【参考方案1】:

Jira HIVE-21575 是关于引入一种使用 SQL:2016 兼容格式而不是当前使用的SimpleDateFormat 的方法,同时它应该提供简单的方法来精确转换非标准时间戳格式。 而且我发现那个子Jira HIVE-21868在4.0版本中发布了

如果你有 Hive

    标准时间戳格式为“yyyy-MM-dd HH:mm:ss.SSSSSSSSS”(精度高达 9 位)。如果您有这种格式的字符串,您可以使用timestamp(str)cast(str as timestamp) 转换为时间戳,虽然在大多数情况下您不需要显式转换,它会隐式完成,不会丢失精度,您可以将此类字符串插入时间戳列并与没有转换的时间戳进行比较。

    对于以纳秒为单位的非标准格式的时间戳,您需要进行转换。 这里的问题是 date_format 方法不起作用,因为它需要标准格式的时间戳。 from_unixtime(unix_timestamp(str, format)) 不起作用,因为unix_timestamp 函数返回秒,而不是纳秒,经过这种转换,毫秒和纳秒会丢失。

非标准格式的解决方案是从字符串中提取毫秒或纳秒,使用 unix_timestamp(str, format) 以秒为单位进行转换,将结果与毫秒连接,然后使用 timestamp() 或强制转换转换为时间戳(最后一步没有必要)。

演示(Hive 2.3.6):

with your_data as (
select
'16AUG2001:23:46:32.123456789'  --non standard format
 as ts
) 

select ts as original_string, 
       timestamp( --in most cases you can do without final timestamp() conversion
       concat(
              from_unixtime(unix_timestamp(split(ts,'\\.')[0],'ddMMMyyyy:HH:mm:ss')), --timestamp with seconds precision
              '.', split(ts,'\\.')[1] --digits after dot
             ) 
                ) as timestamp_converted
  from your_data;

结果:

original_string                 timestamp_converted
16AUG2001:23:46:32.123456789    2001-08-16 23:46:32.123456789

如您所见,它可以在纳秒级精度下正常工作。我使用最终时间戳(字符串)转换只是为了表明生成的字符串与时间戳兼容,您可以省略显式转换时间戳(字符串)。

    如果您最初拥有以毫秒为单位的 bigint unix 时间戳,并希望将其转换为 Hive 时间戳,请参阅以下秘籍:https://***.com/a/63672215/2700344

    如果您有类似“2019-11-02T20:18:00.123Z”这样的字符串,则方法有点不同,请参阅:https://***.com/a/58713989/2700344 如果可以使用 regexp_replace 轻松地将字符串转换为标准格式,则此方法有效。

【讨论】:

您使用的是哪个版本的 Hive?我正在使用 2.3.3 并且似乎不能在小数秒内获得超过 6 位的精度,当然不能达到 9(那太好了!) @emberfly 我使用的是 2.3.6 @emberfly 这个timestamp('2001-08-16 23:46:32.123456789') - 也不起作用?那么它是错误的 Hive 版本 @emberfly 另请阅读:community.cloudera.com/t5/Support-Questions/… Hive 2.3.2 可以正常使用 9 位数字 @emberfly 你用的是什么客户端?也许是客户端问题。我在 Hue 和 Qubole GUI 中测试过

以上是关于我需要哪个版本的 Hive 在小数秒内具有超过 6 个小数位的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章

hive最早在哪个版本起支持Parquet格式

如何创建一个 Django 自定义字段来存储 MYSQL DATETIME(6) 并在 Django/MySQL 中启用小数秒(毫秒或微秒)?

MySQL数据类型 - 日期和时间类型

HIVE 分桶模式

Chrome 难抵恶意下载攻击 数秒内耗尽资源失去响应

使用异步数据调用在小部件内绑定“foreach”