PIG中的日期格式问题

时间:2017-06-10 17:02:39

标签: apache-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

Pig Script1:

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] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066:无法打开迭代器   for alias C.后端错误:org.apache.pig.b   ackend.executionengine.ExecException:错误0:异常时   执行[POUserFunc(名称:   POUserFunc(org.apache.pig.builtin.ToDate2ARGS)[datetime] - sc ope-25   运算符键:scope-25)children:[]]处为null:   java.lang.IllegalArgumentException:格式无效:“date”详细信息   logfile:/home/manasa.testing_gmail/pig_1497109612992.log

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

我试图在

中将日期格式更改为“MM / dd / yyyy”

“C = FOREACH B生成ToDate(tripdate,'yyyy-MM-dd')为mytripdate;”保持剩余的脚本相同...但我得到关于dateformat的同样错误....

任何人都可以帮我进一步......

提前致谢....

1 个答案:

答案 0 :(得分:0)

你必须使用你的第二个猪脚本,因为猪有从日志中加载datetime数据类型的问题。

无法使用的原因:

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

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

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

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

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

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

B = FOREACH A GENERATE tripdate;

C = FOREACH B生成ToDate(tripdate,' MM / dd / yyyy')为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生成ToString(mytripdate,' yyyy-MM-dd')为mytripdate;

你会得到像这样的输出

(2015年2月27日)

(2015年2月27日)

(2015年2月27日)

(2015年2月27日)