我是新来的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:脚本2:
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\u 149587848804\u 1697 2017-06-10 16:58:32785[main]info org.apache.pig.backend.hadoop.executionengine.mapreducelayer.mapreducelauncher-失败!2017-06-10 16:58:32790[main]错误org.apache.pig.tools.grunt.grunt-错误1066:无法打开alias c的迭代器。后端错误:org.apache.pig.b ackend.executionengine.executexception:错误0:执行[pouserfunc(名称:pouserfunc(org.apache.pig.builtin.todate2args)[datetime]-sc ope-25 operator key:scope-25]子项时出现异常:[]:java.lang.illegalargumentexception:格式无效:“date”日志文件中的详细信息:/主页/manasa.testing\u gmail/pig\u 1497109612992.log
有一些问题与这个问题有关,但无法得到正确的解决方案或我的问题。使用pig加载日期时间格式文件
我试着把日期格式改成“mm/dd/yyyy”,同样在
“c=foreach b生成todate(tripdate,'yyyy-mm-dd')作为mytripdate;”保持其余脚本不变。。。但我得到同样的错误说,关于日期格式。。。。
谁能帮我走得更远。。。
提前谢谢。。。。
1条答案
按热度按时间7qhs6swi1#
必须使用第二个pig脚本,因为pig在从日志加载datetime数据类型时遇到问题。
不起作用的原因:
数据集/日志中的日期格式与使用pig脚本传递的格式不同。所以你才会犯这个错误
日志中的日期格式为“mm/dd/yyyy”
c=foreach b生成todate(tripdate,'yyyy-mm-dd')作为mytripdate;
而根据你的脚本应该是'yyyy-mm-dd'
解决方案:只需在系统中插入日志路径,就可以简单地复制行下的粘贴
a=使用pigstorage(',')作为加载“/tmp/a.log”(base:chararray, tripdate:chararray, cars:int, tripkms:int);
b=每个a生成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-02-27)
(2015-02-27)
(2015-02-27)
(2015-02-27)