Apache Pig 日期时间 - 无效格式错误

Posted

技术标签:

【中文标题】Apache Pig 日期时间 - 无效格式错误【英文标题】:Apache Pig Date time - invalid format error 【发布时间】:2016-09-15 13:07:50 【问题描述】:

我对猪的日期时间数据类型有疑问。我尝试使用但格式无法正常工作。我不明白错误是什么:使用的代码如下

`records = LOAD '/tmp/project/sample.csv' USING PigStorage(',') AS (CUSTOMER_ID:in`t,READING_DATETIME:chararray,CALENDER_KEY:int,EVENT_KEY:int,GENERAL_SUPPLY_KWH:float,CONTROLLED_LOAD_KWH:float,GROSS_GENERATION_KWH:float,NET_GENERATION_KWH:float,OTHER_KWH:float); 

test = FOREACH records GENERATE CUSTOMER_ID,READING_DATETIME;

dates= FOREACH test GENERATE  CUSTOMER_ID,ToDate(READING_DATETIME,'dd-MM-yyyy HH:mm') AS READING_DATETIME; 

sample.csv 中的示例数据如下,(前两列仅粘贴在这里)

CUSTOMER_ID READING_DATETIME
10017574    31-05-2013 18:30
10017574    10-06-2013 05:30
10017574    29-06-2013 04:30
10017574    04-07-2013 20:30
10017574    05-07-2013 17:00
10017574    12-07-2013 10:30
10017574    13-07-2013 20:00
10017574    16-07-2013 13:00
10017574    19-07-2013 20:00

以上命令执行正常。此外,当我将 DESCRIBE 用于“日期”时, 它返回:

grunt> DESCRIBE dates
dates: CUSTOMER_ID: int,READING_DATETIME: datetime 

现在当我使用

toPrint = LIMIT dates 5;
DUMP toPrint;



  2016-09-15 05:43:39,000 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Some jobs have failed! Stop running all dependent jobs
    2016-09-15 05:43:39,013 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias toPrint. Backend error : Invalid format: "READING_DATETIME"

我已经多次验证了字符串格式。甚至我从 JODA 类中使用的 oracle 简单数据格式检查了猪使用的日期时间。 我已经为相同的数据尝试了几种组合。尝试在线浏览。仍然没有解决问题。对我来说似乎是一件非常愚蠢的事情,但无法解决它。

【问题讨论】:

【参考方案1】:

从您附加的示例数据中,数据看起来不像是逗号分隔的。在您的加载语句中,您使用“,”作为分隔符。 为了解决这个问题,您有 2 个选项。

    将输入文件转换为逗号分隔的输入文件 或者 使用正确的分隔符加载数据。

我使用制表符作为分隔符,效果很好。见下文

数据

10017574    31-05-2013 18:30
10017574    10-06-2013 05:30
10017574    29-06-2013 04:30
10017574    04-07-2013 20:30
10017574    05-07-2013 17:00
10017574    12-07-2013 10:30
10017574    13-07-2013 20:00
10017574    16-07-2013 13:00
10017574    19-07-2013 20:00

脚本

records = LOAD 'test12.txt' USING PigStorage('\t') AS (CUSTOMER_ID:int,READING_DATETIME:chararray); 
test = FOREACH records GENERATE CUSTOMER_ID,READING_DATETIME;
dates= FOREACH test GENERATE  CUSTOMER_ID,ToDate(READING_DATETIME,'dd-MM-yyyy HH:mm') AS READING_DATETIME;
DUMP dates;

输出

【讨论】:

问题可能不在于分隔符,我尝试使用 '\t' 并且文件根本没有加载。它在 pig 输出的“输入”部分返回文件未读取错误。选项卡对您有用的原因可能是因为我将 CSV 粘贴为文本。你能建议我做什么吗?此外,以前当我转储用 ',' 存储的 'records' 时,它运行良好。我可以看到输出。

以上是关于Apache Pig 日期时间 - 无效格式错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache Pig/Apache Hive 中给定日期范围的数据汇总

apache pig - 基于日期列存储文件

日期时间格式无效:1292 日期时间值不正确 [重复]

Apache Pig Group / 展平 / 加入

PIG 中的日期格式问题

在“时间数据与格式不匹配”​​中捕获无效的月/日