在 Hive 或 Impala 中从 int 转换为时间戳

Posted

技术标签:

【中文标题】在 Hive 或 Impala 中从 int 转换为时间戳【英文标题】:Converstion from into to timestamp in Hive or Impala 【发布时间】:2019-06-05 10:56:07 【问题描述】:

在 Impala 或 Hive 中是否有一种简单的方法可以将 int 转换为时间戳数据类型。

我正在使用下面的代码将 int 转换为时间戳,但我认为这不是一种有效的方法。

20180520

CAST(concat(substring(CAST(datalake_date as string),1,4),'-',substring(CAST(datalake_date as string),5,2),'-',substring(CAST(datalake_date as string),7,2)) 
     AS TIMESTAMP)

---用于提取年份---

,date_part('Year',
CAST(concat(substring(CAST(datalake_date as string),1,4),'-',substring(CAST(datalake_date as string),5,2),'-',substring(CAST(datalake_date as string),7,2)) 
     AS TIMESTAMP)
          ) datalake_date

2018

【问题讨论】:

【参考方案1】:

使用unix_timestamp(string date, string pattern) 将给定日期format 转换为从1970-01-01 过去的秒数。然后使用 from_unixtime() 转换为所需的format:

select from_unixtime(unix_timestamp( '20180520','yyyyMMdd'),'yyyy-MM-dd');

返回:

OK
2018-05-20
Time taken: 0.057 seconds, Fetched: 1 row(s)

提取年份的简单方法是使用 substr:

select substr('20180520',1,4);
OK
2018
Time taken: 3.062 seconds, Fetched: 1 row(s)

或者在上述(见第一个查询)转换为标准配置单元格式“yyyy-MM-dd”之后,您可以使用year()date_format 函数

【讨论】:

【参考方案2】:

你可以像这样直接解析成unix时间戳

select unix_timestamp('20180520', 'yyyyMMdd');

之后,您有几个 UDF 来操作您的日期,提取年、日等/

【讨论】:

您使用的格式是错误的。检查这个: select from_unixtime(unix_timestamp('20180520', 'YYYYmmDD'));返回 2017-12-31 00:05:00 - 惊喜不是吗?正确的格式是 yyyyMMdd

以上是关于在 Hive 或 Impala 中从 int 转换为时间戳的主要内容,如果未能解决你的问题,请参考以下文章

Hive/Impala 中压缩 parquet 文件(例如 gz.parquet)的外部表

为什么使用Hive和Impala

Impala 或 Hive 在其他 SQL 语法中是不是有类似 IN 子句的东西?

Impala与Hive的比较

如何从 hive 或 impala 读取 Hbase 当前和以前版本的数据?

从 Hive 或 Webhdfs 运行 Impala Refresh