PIG: ошибка FLATTEN

У меня есть отношение X со структурой X: {group: chararray,inboundCount: {(name: chararray,inb: long)},outboundCount: {(name: chararray,out: long)}} следующим образом:

(IAD,{},{(IAD,25)})
(LAX,{},{(LAX,2)})
(ORD,{(ORD,27)},{})
(PDX,{},{(PDX,3)}) 
(SFO,{(SFO,3)},{})

Мне нужен вывод со следующей структурой final: {airport: chararray,inbound: long,outbound: long}без вывода:

(IAD,,25)
(LAX,,2)
(ORD,27,)
(PDX,,3)
(SFO,3,)

Я пробовал следующий код, и он дает нужную мне структуру вывода. Но ничего не печатается. Это из-за мешков с нулевым значением?

final = foreach X generate group as airport,FLATTEN(inboundCount.inb) as inbound,FLATTEN(outboundCount.out) as outbound;

Помогите пожалуйста мне.

EDIT Я получил это отношение x, выполнив следующие команды.

A= load '/user/hduser/airline.csv' using PigStorage(',') as (year:int,month:int,dayofmonth:int,dayofweek:int,dep:int,CRS:int,Arr:int,CRSArr:int,UniqueCarrier:chararray,FlightNum:int,TailNum:chararray,ActualElapsedTime:int,CRSElapsed:int,AirTime:int,ArrDelay:int,DepDelay:int,Origin:chararray,Dest:chararray,Distance:int,TaxiIn:int,TaxiOut:int,Cancelled:int,CancelCode:chararray,Diverted:int,CarrierDelay:int,WeatherDelay:int,NASDelay:int,SecurityDelay:int,LateAircraft:int);
B= foreach A generate year,month,UniqueCarrier,FlightNum,TailNum,Origin,Dest;
inbound = group B by Dest;
inboundCount = foreach inbound generate group,COUNT(B.FlightNum) as inb;
outbound = group B by Origin;
outboundCount = foreach outbound generate group,COUNT(B.FlightNum) as out;
X = COGROUP inboundCount BY name, outboundCount BY name;

Пример входной записи:

2008,1,31,4,1757,1155,2400,1758,UA,114,N845UA,243,243,217,362,362,LAX,ORD,1745,11,15,0,,0,0,0,362,0,0


person Niyas    schedule 21.08.2015    source источник
comment
В порядке. Это просто отношение X. Не могли бы вы дать реальный набор входных данных и соответствующий оператор свиньи, который вы написали для достижения этого отношения X   -  person Surender Raja    schedule 21.08.2015
comment
@SurenderRaja Я отредактировал вопрос. Надеюсь, поможет.   -  person Niyas    schedule 21.08.2015
comment
В порядке. Похоже, вы хотите узнать, сколько рейсов вылетело и приземлилось в каждом аэропорту. Это правильно?   -  person Surender Raja    schedule 21.08.2015
comment
@SurenderRaja Да. Точно.   -  person Niyas    schedule 22.08.2015


Ответы (1)


Вы почти у цели. Пожалуйста, попробуйте это. Просто примените SUM вместо сглаживания.

 A= load '/user/hduser/airline.csv' using PigStorage(',') as (year:int,month:int,dayofmonth:int,dayofweek:int,dep:int,CRS:int,Arr:int,CRSArr:int,UniqueCarrier:chararray,FlightNum:int,TailNum:chararray,ActualElapsedTime:int,CRSElapsed:int,AirTime:int,ArrDelay:int,DepDelay:int,Origin:chararray,Dest:chararray,Distance:int,TaxiIn:int,TaxiOut:int,Cancelled:int,CancelCode:chararray,Diverted:int,CarrierDelay:int,WeatherDelay:int,NASDelay:int,SecurityDelay:int,LateAircraft:int);

B= foreach A generate year,month,UniqueCarrier,FlightNum,TailNum,Origin,Dest;

inbound = group B by Dest;

inboundCount = foreach inbound generate group,COUNT(B.FlightNum) as inb;

outbound = group B by Origin;

outboundCount = foreach outbound generate group,COUNT(B.FlightNum) as out;

X = COGROUP inboundCount BY name, outboundCount BY name;

final_data = FOREACH X GENERATE group as airport, SUM(inboundCount.inb) as inb, SUM(outboundCount.out) as out;

dump final_data;

Дамп final_data даст вам ожидаемый результат.

(IAD,,25)
(LAX,,2)
(ORD,27,)
(PDX,,3)
(SFO,3,)

Если вы хотите, вы все равно можете заменить счетчик NULL на 0

 final_null_check = FOREACH final_data GENERATE airport,(inb is null ? 0 :inb) as inb_cnt, (out is null ? 0 : out) as out_cnt;

После проверки NULL, если вы сбросите отношение final_null_check, вы получите вывод, как показано ниже.

 (IAD,0,25)
 (LAX,0,2)
 (ORD,27,0)
 (PDX,0,3)
 (SFO,3,0)
person Surender Raja    schedule 21.08.2015
comment
Спасибо. Это сработало очень хорошо. Но можете ли вы сказать мне, почему это не сработало с использованием FLATTEN? - person Niyas; 22.08.2015