2016-05-09 4 views
0

Я передаю пакет в python и рассчитываю вернуть запись с Python udf. Я должен делать что-то неправильно в Outputschema и заканчивать тем, что каждый столбец является Tuple. Буду признателен за любую оказанную помощь.Python UDF in Pig не возвращает запись

Pig код:

REGISTER 'priority.py' using jython as callme 
A = LOAD 'addr_input/addr.dat' USING PigStorage(',') AS (A : chararray, B :chararray , C: chararray , ID : chararray, ID_TYPE : chararray); 

B = DISTINCT A; 
Z= GROUP B BY (A,B,C); 
O = FOREACH Z GENERATE callme.unique_list($1) ; 
DUMP O; 

Python код:

@outputSchema('relationships:{t:(A : chararray, B :chararray , C: chararray , ID : chararray, ID_TYPE : chararray)}') 
def unique_list(input): 
my_list = list(input) 
print(my_list) 
last_list = [] 
zipcnt = -1 
citicnt = -1 
countycnt = -1 
statecnt = -1 
return_list_zip = [] 
return_list_city = [] 
return_list_county = [] 
return_list_state = [] 
return_list_country = [] 
for j in range(len(my_list)): 
     if(my_list[j][4]) == "zip": 
     zipcnt = len(my_list) 
     return_list_zip = list(my_list[j]) 
     continue 
     elif (my_list[j][4] == 'city' and zipcnt == -1): 
      citicnt = len(my_list) 
      return_list_city = list(my_list[j]) 
      continue 

     elif (my_list[j][4] == 'county' and zipcnt == -1 and citicnt == -1): 
      countycnt = len(my_list) 
      return_list_county = list(my_list[j]) 
      continue 
     elif (my_list[j][4] == 'state'and zipcnt == -1 and citicnt == -1 and countycnt == -1): 
      statecnt = len(my_list) 
      return_list_state = list(my_list[j]) 
      continue 
     elif (my_list[j][4] == 'country'and zipcnt == -1 and citicnt == -1 and countycnt == -1 and statecnt == -1): 
      return_list_country = list(my_list[j]) 
      continue 
if(zipcnt != -1): 
    return_list = return_list_zip 
elif(citicnt != -1): 
    return_list = return_list_city 
elif(countycnt != -1): 
    return_list = return_list_county 
elif (statecnt != -1): 
    return_list = return_list_state 
else: 
    return_list = return_list_country 
return return_list 

выход я получаю:

({(aa),(bb),(cc),(1),(zip)}) 
({(lll),(ccc),(ddd),(6),(city)}) 
({(lll),(ccc),(xxx),(7),(country)}) 
({(mmm),(nnn),(cc),(4),(zip)}) 

--- Каждый столбец придумывает как кортеж!

Выход я ожидал:

{aa,bb,cc,1,zip} 
    {lll,ccc,ddd,6,city} 

Ваша помощь очень ценится.

+0

Вы можете предоставить данные ввода образца? –

+0

@VikasMadhusudana: Пример ввода: AA, BB, CC, 1, застежка-молния AA, BB, CC, 2, уличные ттт, NNN, сс, 3, графство ттт, NNN, куб.см, 4, ZIP ттт, NNN , cc, 5, state lll, ccc, ddd, 6, city lll, ccc, xxx, 7, country – SanBan

ответ

0

Сумка представляет собой набор кортежей. Ответ, который вы получаете, действителен.

+0

: Мне нужен вывод как запись, подобная оригинальным метаданным, а не сумке. Как это можно достичь? Благодарю. – SanBan

0

Попробуйте

A = LOAD 'addr_input/addr.dat' USING PigStorage(',') AS (A : chararray, B :chararray , C: chararray , ID : chararray, ID_TYPE : chararray); 

B = DISTINCT A; 
Z= GROUP B BY (A,B,C); 
DESCRIBE Z 
O = foreach Z { f1 = foreach B generate $0,$1,$2,$3,$4; generate flatten(f1);} 
dump O 

Для входа вы дали это выход

(aa,bb,cc,1,zip) 
(aa,bb,cc,2,street) 
(lll,ccc,ddd,6,city) 
(lll,ccc,xxx,7,country) 
(mmm,nnn,cc,3,county) 
(mmm,nnn,cc,4,zip) 
(mmm,nnn,cc,5,state) 

ли это то, что вы ищете?