HIVE中的TIMESTAMP格式问题

时间:2017-06-09 22:00:50

标签: hadoop hive cloudera hiveql

我有从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]

1 个答案:

答案 0 :(得分:1)

在其中引入了return RequestWidgets(key: ValueKey(modal.item[i].id),data: modal.item[i]); // Or some value unique for each item 的吉拉HIVE-9298在描述中说,它用于LazySimpleSerDe。我没有在文档中找到其他SerDe所做的其他提及。

解决方案是将时间戳定义为STRING并在选择中进行转换。

timestamp.formats格式的示例:

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

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