2015-08-21 1 views
0

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

(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, ОРД, 1745,11,15 , 0,, ​​0,0,0,362,0,0

+0

Ok. Это просто отношение X. Не могли бы вы дать реальный входной набор данных и соответствующий отчет свиньи, который вы написали, чтобы достичь этого отношения. X –

+0

@SurenderRaja Я отредактировал вопрос. Надеюсь, поможет. – niyas

+0

Хорошо. Похоже, вы хотели бы узнать, сколько рейсов взлетели и приземлились в каждом аэропорту. Правильно ли это? –

ответ

1

Вы почти there.Pls попробовать это .Just применить 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_d ata даст вам ожидаемый результат.

(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) 
+0

Спасибо. Это работало очень хорошо. Но можете ли вы сказать мне, почему это не сработало с помощью FLATTEN? – niyas