【问题标题】:TIMESTAMP format issue in HIVEHIVE 中的 TIMESTAMP 格式问题
【发布时间】:2017-11-12 00:44:14
【问题描述】:

我有从 JSON 文件创建的 Hive 表。

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

我为页面中给出的时间戳格式指定了 SERDEPROPERTIES。 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-TimestampstimestampTimestamps

创建语句执行成功但select * 失败并出现以下错误。

HIVE_BAD_DATA:解析字段值“2017-06-01T17:51:15.180400”时出错 对于字段 1:时间戳格式必须为 yyyy-mm-dd hh:mm:ss[.fffffffff]

【问题讨论】:

    标签: hadoop hive hiveql cloudera create-table


    【解决方案1】:

    Jira HIVE-9298 在其中引入了 timestamp.formats,在描述中说它是用于 LazySimpleSerDe。我在文档中没有发现任何其他提及它是为其他 SerDe 完成的。

    解决方法是在select中定义timestamp为STRING并进行transform。

    yyyy-MM-dd'T'HH:mm:ss.SSSSSS 格式示例:

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

    如果数据文件中同时存在这两种格式,这将适用于 yyyy-MM-dd'T'HH:mm:ss.SSSSSSyyyy-MM-dd HH:mm:ss.SSSSSS(正常时间戳)。

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

    正则表达式功能强大,您可以使用相同的模式解析不同的字符串格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-16
      • 2017-11-02
      • 1970-01-01
      • 2021-12-26
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多