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)
我是 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)