【问题标题】:Pig Script working on 0.12.0 but not on 0.11.1Pig 脚本适用于 0.12.0 但不适用于 0.11.1
【发布时间】:2013-12-06 02:21:46
【问题描述】:

我编写了这个在 0.12.0 版本上完美运行的猪脚本,但我无法让它在 0.11.1 版本上运行 我无法确定真正缺少什么。

data = LOAD '<file_name>' USING PigStorage(',') AS 
(Year,Month:int,DayofMonth,DayOfWeek,DepTime,CRSDepTime,ArrTime,CRSArrTime,UniqueCarrier,
    FlightNum,TailNum,ActualElapsedTime,CRSElapsedTime,AirTime,ArrDelay:int,DepDelay,Origin,
    Dest,Distance,TaxiIn,TaxiOut,Cancelled,CancellationCode,Diverted,CarrierDelay,
    WeatherDelay,NASDelay,SecurityDelay,LateAircraftDelay);
A = FILTER data BY (ArrDelay > 0);
X = GROUP A BY (Dest, Year, 
        (
            Case
                when Month>2 AND Month<6 THEN 'SPRING'
                when Month>5 AND Month<9 THEN 'SUMMER'
                when Month>8 AND Month<12 THEN 'FALL'
                when Month==12 OR (Month<3 AND Month>0) THEN 'WINTER'
            END
        )
    );
Y = FOREACH X GENERATE group.Dest, group.Year, group.$2, SUM(A.ArrDelay);
STORE Y INTO 'myoutput';

这是运行脚本时给出的异常。

Pig Stack Trace
---------------
ERROR 1200: <file DelayBySeasonPerYear.pig, line 7, column 16>  Syntax error, unexpected symbol at or near 'Dest'

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1000: Error during parsing. <file DelayBySeasonPerYear.pig, line 7, column 16>  Syntax error, unexpected symbol at or near 'Dest'
    at org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1607)
    at org.apache.pig.PigServer$Graph.registerQuery(PigServer.java:1546)
    at org.apache.pig.PigServer.registerQuery(PigServer.java:516)
    at org.apache.pig.tools.grunt.GruntParser.processPig(GruntParser.java:991)
    at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:412)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:194)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:170)
    at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84)
    at org.apache.pig.Main.run(Main.java:604)
    at org.apache.pig.Main.main(Main.java:157)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:160)
Caused by: Failed to parse: <file DelayBySeasonPerYear.pig, line 7, column 16>  Syntax error, unexpected symbol at or near 'Dest'
    at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:235)
    at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:177)
    at org.apache.pig.PigServer$Graph.parseQuery(PigServer.java:1599)
    ... 14 more

【问题讨论】:

  • 提示,Y 可以只是 Y = FOREACH X GENERATE FLATTEN(group), SUM(A.ArrDelay);。当您在元组上使用 FLATTEN 时,它与单独生成每个元素的作用相同(就像您所做的那样)。

标签: java hadoop mapreduce apache-pig


【解决方案1】:

CASE 最近才在 0.12 版中实现。它在 0.11 中不可用。

见:


建议的解决方法:

写一个UDF,它接受一个月份值,然后返回一个带有写出季节的chararray。然后,在 FILTER 之后的 FOREACH 语句中使用此 UDF。

...
A = FILTER data BY (ArrDelay > 0);
A = FOREACH A GENERATE MySeasonUDF(Month) as Season, Dest, Year, ArrDelay;
X = GROUP A BY (Dest, Year, Season);
...

【讨论】:

  • 我知道你能建议任何解决方法,我可以使用什么来代替 Case 来实现相同的功能
  • @DonaldMiner UDF 在GROUP 中不可用吗?像X = GROUP A BY (Dest, Year, MySeasonUDF(Month)) ; 这样的东西应该会阻止额外的地图作业,除非猪会自动优化它。
  • @mr2ert pig 自动将连续的多个 foreach/filter 折叠成一个映射(如果在组之后,则减少)。但是,我认为你是对的,你可以在小组中做到这一点。语法上肯定更简单。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2021-10-27
  • 2012-08-04
  • 2014-08-11
  • 1970-01-01
相关资源
最近更新 更多