配置单元中的时间戳格式问题

mwg9r5ms  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(397)

我已经从json文件创建了配置单元表。

CREATE external TABLE logan_test.t1 (
   name string,
   start_time timestamp
   )
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES (
  "timestamp.formats" = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"
)
LOCATION 's3://t1/';

我的时间戳数据的格式是 yyyy-MM-dd'T'HH:mm:ss.SSSSSS .
我为页面中给出的时间戳格式指定了serdeproperty。https://cwiki.apache.org/confluence/display/hive/languagemanual+types#languagemanualtypes-时间戳时间戳
create语句已成功执行,但 select * 失败,出现以下错误。
配置单元错误数据:分析字段1的字段值“2017-06-01t17:51:15.180400”时出错:时间戳格式必须为yyyy-mm-dd hh:mm:ss[.fffffff]

l7wslrjt

l7wslrjt1#

jira hive-9298其中 timestamp.formats 是介绍的,在描述中说是为懒虫。我在文档中没有发现任何其他提到它是为其他serde所做的。
解决方案是将时间戳定义为字符串,并在select中进行转换。
例如 yyyy-MM-dd'T'HH:mm:ss.SSSSSS 格式:

select timestamp(regexp_replace(start_time, '^(.+?)T(.+?)','$1 $2'))

这对双方都有效 yyyy-MM-dd'T'HH:mm:ss.SSSSSS 以及 yyyy-MM-dd HH:mm:ss.SSSSSS (正常时间戳)如果数据文件中同时存在这两种格式。

timestamp(regexp_replace(start_time, '^(.+?)[T ](.+?)','$1 $2'))

regex功能强大,可以使用相同的模式解析不同的字符串格式。

相关问题