Java Pig脚本在0.12.0上工作,但不在0.11.1上工作

Java Pig脚本在0.12.0上工作,但不在0.11.1上工作,java,hadoop,mapreduce,apache-pig,Java,Hadoop,Mapreduce,Apache Pig,我已经编写了这个pig脚本,它在版本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,

我已经编写了这个pig脚本,它在版本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';
data=LOAD'',使用PigStorage(',')作为
(年、月:int、月日、周日、DepTime、crsdepime、ArrTime、crsartime、UniqueCarrier、,
FlightNum、TailNum、ActualLapsedTime、CRSElapsedTime、AirTime、ArrDelay:int、DepDelay、Origin、,
目的地、距离、滑行入、滑行出、取消、取消代码、改道、承运人延迟、,
天气延迟、NASDelay、安全延迟、晚点飞机延迟);
A=根据(ARRDEAL>0)过滤数据;
X=A组(目的地、年份、,
(
案例

当第2个月和第5个月、第8个月和第
个月时,案例
最近才在版本0.12中实现。它在0.11中不可用

见:

  • (注意修复版本0.12)
  • (关于0.12中新功能的博客文章,其中一个是
    CASE

建议的解决办法:

编写一个函数,它接受一个月值,然后返回一个带有已写出季节的
chararray
。然后,在筛选后的
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);
...

我明白了,你能提出一些建议吗?我可以用什么来代替案例来达到同样的效果functionality@DonaldMinerUDF在
组中不可用吗
?类似于
X=groupa BY(Dest,Year,MySeasonUDF(Month));
应防止额外的映射作业,除非pig自动对此进行优化。@mr2ert pig自动将一行中的多个foreach/filter折叠为一个映射(如果在组之后,则减少)但是,我认为你是对的,你可以在组中进行。语法上更简单。提示,
Y
可以是
Y=FOREACH X GENERATE FLATTEN(group),SUM(A.ArrDelay);
。当你在元组上使用
flatte
时,它的作用与单独生成每个元素相同(就像你所做的那样)。
...
A = FILTER data BY (ArrDelay > 0);
A = FOREACH A GENERATE MySeasonUDF(Month) as Season, Dest, Year, ArrDelay;
X = GROUP A BY (Dest, Year, Season);
...