PIG 中的日期格式问题

Posted

技术标签:

【中文标题】PIG 中的日期格式问题【英文标题】:Issue with date format in PIG 【发布时间】:2017-06-10 17:02:38 【问题描述】:

我是 PIG 的新手,我尝试分析 UberDataSet 2 个月,以了解哪一天预订的行程更多。

格式:

B02617,2/27/2015,1551,14677

B02598,2/27/2015,1114,10755

B02512,2/27/2015,272,2056

B02764,2/27/2015,4253,38780

猪脚本1:

A = Load 'UberDataSet.txt' using PigStorage(',') as 
(base:chararray, tripdate:datetime, cars:int, tripkms:int);

DESCRIBE A;

DUMP A;

我可以看到 tripdate 是 datetime 类型,但我只得到 ,, 输出而不是日期。

输出:

(B02682,,1395,12693)

(B02617,,1473,12811)

(B02764,,3934,31957)

(B02598,,1134,10661)

(B02617,,1539,14461)

(B02682,,1465,13814)

(B02512,,243,1797)

然后我就这样尝试了。

Pigscript2:

A = Load 'UberDataSet.txt' using PigStorage(',') as 
(base:chararray, tripdate:chararray, cars:int, tripkms:int);

B = FOREACH A GENERATE tripdate;

C = FOREACH B GENERATE ToDate(tripdate,'yyyy-MM-dd') as mytripdate;

DESCRIBE C;

DUMP C;

作业失败并显示错误消息:

Job DAG:job_1495878748804_1697 2017-06-10 16:58:32,785 [main] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 失败的! 2017-06-10 16:58:32,790 [main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1066:无法打开迭代器 对于别名 C. 后端错误:org.apache.pig.b ackend.executionengine.ExecException:错误0:异常同时 执行 [POUserFunc (名称: POUserFunc(org.apache.pig.builtin.ToDate2ARGS)[日期时间] - sc ope-25 运算符键:scope-25) 子项:[]] 处为空: java.lang.IllegalArgumentException:无效格式:“日期”详细信息在 日志文件:/home/manasa.testing_gmail/pig_1497109612992.log

有一些与此问题相关的问题,但无法找到正确的解决方案或我的问题。 Loading datetime format files using PIG

我也尝试将日期格式更改为“MM/dd/yyyy”

"C = FOREACH B GENERATE ToDate(tripdate,'yyyy-MM-dd') as mytripdate;"保持剩余的脚本相同...但是关于 dateformat 的说法相同...

谁能帮我更进一步...

提前谢谢....

【问题讨论】:

【参考方案1】:

您必须使用第二个猪脚本,因为猪在从日志中加载日期时间数据类型时遇到问题。

无法正常工作的原因:

数据集/日志中的日期格式与您使用 pig 脚本传递的格式不同。这就是您收到此错误的原因

日志中的格式日期为 'MM/dd/yyyy'

C = FOREACH B GENERATE ToDate(tripdate,'yyyy-MM-dd') as mytripdate;

根据您的脚本,它应该是 'yyyy-MM-dd'

解决方案:您只需在系统中插入日志路径即可简单地复制粘贴以下行

A = 使用 PigStorage(',') 加载 '/tmp/a.log' 作为 (base:chararray, tripdate:chararray, cars:int, tripkms:int);

B = FOREACH A GENERATE tripdate;

C = FOREACH B GENERATE ToDate(tripdate,'MM/dd/yyyy') as mytripdate;

你会得到输出为

(2015-02-27T00:00:00.000+05:30)

(2015-02-27T00:00:00.000+05:30)

(2015-02-27T00:00:00.000+05:30)

(2015-02-27T00:00:00.000+05:30)

现在,如果您想进一步格式化日期,可以使用 ToString() 函数。

D = FOREACH C GENERATE ToString(mytripdate,'yyyy-MM-dd') as mytripdate;

你会得到这样的输出

(2015-02-27)

(2015-02-27)

(2015-02-27)

(2015-02-27)

【讨论】:

以上是关于PIG 中的日期格式问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中以 yyyy-mm-dd 格式获取今天的日期

使用 Pig latin 从文件中获取最大日期

在生成语句中格式化日期

避免个别行在 Pig 中的 ToDate 中出现异常

Pig 脚本到日期转换问题导致不同的输出

Apache Pig ToDate UDF 时间戳格式