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 未检测到时间戳格式的主要内容,如果未能解决你的问题,请参考以下文章