【问题标题】:Hive TimeStamp column with TimeZone带有 TimeZone 的 Hive TimeStamp 列
【发布时间】:2021-12-26 10:57:48
【问题描述】:

我在 hive 中创建了一个表,其中一列作为时间戳数据类型。当我插入蜂巢时,与现有的不同。

我的专栏预期值:2021-11-03 16:57:10.842 UTC(我得到的是字符串)。我如何将上述输出存储在配置单元表中(数据类型为时间戳的列)

【问题讨论】:

  • 您能否用现有的输入和所需的输出展示您的代码?

标签: apache-spark hive apache-spark-sql


【解决方案1】:

您需要在删除单词 UTC 后使用 cast 将其转换为时间戳。由于 hive 不有意关心时区,并以 UTC 显示数据,因此您应该处于良好状态。

select cast( substr('2021-11-03 16:57:10.84 UTC',1,23)  as timestamp) as ts

请注意,您需要有上述 yyyy-MM-dd hh:mm:ss.SS 格式的数据。
另请注意,您不能使用from_unixtime(unix_timestamp(string_col , 'dd-MM-yyyy HH:mm:ss.SSS')),因为我们会丢失毫秒部分。

【讨论】:

  • @Koshik 我的问题是,我们可以在配置单元表中加载任何带有时区后缀的时间戳列吗?
  • SUSPENSION_START_TS: 1592247846685,我使用的函数 - date_format(concat_ws('.',from_unixtime(cast(STG.SUSPENSION_START_TS/1000 as BIGINT),'yyyy-MM-dd HH:mm:ss') ,cast(floor(STG.SUSPENSION_START_TS % 1000) as STRING)),'yyyy-MM-dd HH:mm:ss.SSS z') SUSPENSION_START_TS,date_format(concat_ws('.',from_unixtime(cast(STG.SUSPENSION_START_TS/ 1000 as BIGINT),'yyyy-MM-dd HH:mm:ss'),cast(floor(STG.SUSPENSION_START_TS % 1000) as STRING)),'yyyy-MM-dd HH:mm:ss.SSS') SUSPENSION_START_TS1
  • 我可以看到基本问题...如果您有秒数,则无法计算毫秒数。毫秒将始终为 0。因此,当您执行 floor(STG.SUSPENSION_START_TS % 1000) 时,它将始终返回 0 毫秒。
猜你喜欢
  • 1970-01-01
  • 2016-04-21
  • 2019-01-28
  • 2012-03-02
  • 2017-09-16
  • 2017-03-19
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多