Hive 未检测到时间戳格式

Posted

技术标签:

【中文标题】Hive 未检测到时间戳格式【英文标题】:Hive not detecting timestamp format 【发布时间】:2015-06-25 13:17:40 【问题描述】:

我有一个 PIG 脚本

从 csv 加载和转换数据 替换一些字符

调用 java 程序 (JAR) 将 csv 中的日期时间从 06/02/2015 18:52 转换为 2015-6-2 18:52(mm/DD/yyyy 到 yyyy-MM-dd)

REGISTER /home/cloudera/DateTime.jar;

A = Load '/user/cloudera/Data.csv' using PigStorage(',') as (ac,datetime,amt,trace);

B = FOREACH A GENERATE ac, REPLACE(datetime, '\\/','-') as newdate,REPLACE(amt,'-','') as newamt,trace;

C = FOREACH B GENERATE ac,Converter.DateTime(newdate) as ConvDate,ConvAmt,trace;

Store C into '/user/cloudera/Output/' using PigStorage('\t');

样本输入 -- 21467245 06/02/2015 18:52 -9.59 518

样本输出 -- 21467245 2015-6-2 18:52 9.59 518

我正在将输出加载到配置单元中,其他字段在导入过程中似乎很好,但是如果作为时间戳加载,日期时间字段结果为 null,并且在其字符串时是完整的。

这是哪里出了问题?

我正在使用 Cloudera CDH 5

【问题讨论】:

pig内置了ToDate()函数。 @GoBrewers14 - 它是否将输出格式从 pig 更改为与 Hive 兼容以作为时间戳摄取? @GoBrewers14 ToDate(newdate, 'MM-dd-yyyy HH:mm') 给出 2015-06-02T18:52:00.000Z Hive 仍然不采用这种格式,因为它需要 yyyy-MM -dd 作为时间戳。 如果您需要yyyy-MM-dd,那么为什么要将yyyy-MM-dd HH:mm 放入ToDate() 函数中?只需输入yyyy-MM-dd @GoBrewers14 ToDate(newdate, 'yyyy-MM-dd HH:mm') 给出错误,我在发表评论之前尝试过。后端错误:org.apache.pig.backend.executionengine.ExecException:错误0:执行时出现异常[POUserFunc(名称:POUserFunc(org.apache.pig.builtin.ToDate2ARGS)[datetime] - scope-38 Operator Key:scope- 38) children: null at []]: java.lang.IllegalArgumentException: Invalid format: "06-02-2015 18:52" is malformed at "15 18:52" 据我所知,Hive 可以采用 yyyy-MM- dd HH:mm 格式,如果包括时间,这是我试图实现的目标 【参考方案1】:

来自the hive docs:

文本文件中的时间戳必须使用格式 yyyy-mm-dd hh:mm:ss[.f...]。如果它们是另一种格式,请将它们声明为 适当的类型(INT、FLOAT、STRING 等)并使用 UDF 进行转换 他们到时间戳。

因此,您需要更改 Converter 以输出此格式,或使用 UDF --- 或将它们保留为字符串,这是我通常做的!

【讨论】:

当它们被导入到 hive 时,我需要进行一系列操作,例如决定是早上还是晚上,给定时间段内的帐户数量等等。我相信如果它是字符串格式,我将无法这样做。你能帮我解决这个问题吗?

以上是关于Hive 未检测到时间戳格式的主要内容,如果未能解决你的问题,请参考以下文章

将五个小时添加到时间戳字段

js 怎么取到时间戳里面的月份?

BigQuery:字符串到时间戳

将日期添加到时间戳

将浮点列添加到时间戳类型列(秒+毫秒)

如何使用 python 在 HIVE 中创建 UDF 进行时间戳转换