PIG 中的日期格式问题

Issue with date format in PIG

我是 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 - Failed! 2017-06-10 16:58:32,790 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066: Unable to open iterator for alias C. Backend error : org.apache.pig.b ackend.executionengine.ExecException: ERROR 0: Exception while executing [POUserFunc (Name: POUserFunc(org.apache.pig.builtin.ToDate2ARGS)[datetime] - sc ope-25 Operator Key: scope-25) children: null at []]: java.lang.IllegalArgumentException: Invalid format: "date" Details at logfile: /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;" 保持剩余的脚本相同...但是我在说日期格式时遇到同样的错误....

谁能帮我更进一步...

提前致谢....

您必须使用第二个 pig 脚本,因为 pig 无法从日志中加载日期时间数据类型。

不工作的原因:

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

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

C = FOREACH B 生成 ToDate(tripdate,'yyyy-MM-dd') 作为 mytripdate;

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

解决方案:您只需在系统中插入日志路径即可复制粘贴到下面的行

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

B = FOREACH A GENERATE tripdate;

C = FOREACH B 生成 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)