我需要哪个版本的 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 个小数位的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个 Django 自定义字段来存储 MYSQL DATETIME(6) 并在 Django/MySQL 中启用小数秒(毫秒或微秒)?