2016-05-09 3 views
0

У меня есть master.txt, у которого есть 10K записей, поэтому каждая его строка будет кортежем & все то же самое нужно передать python UDF. Поскольку он имеет несколько записей, так что при сохранении p2preportmap появляется следующая ошибка. Пожалуйста, помогитеНевозможно передать свиной кортеж в python UDF

Ошибка заключается в следующем:

Невозможно открыть итератор для псевдонима p2preportmap. Ошибка backend: org.apache.pig.backend.executionengine.ExecException: ОШИБКА 0: Scalar имеет более одной строки на выходе. 1: (010301, MTS, MM), 2 : (010B06, MTS, TN) (общая причина: «ПРИСОЕДИНЯЙТЕСЬ», затем «FOREACH ... GENERATE foo.bar» должно быть «foo :: bar»)

свиней Сценарий выглядит следующим образом:

REGISTER 'smsiuc_udf.py' using streaming_python as smsiuc_udfs; 
cdrs = load '2016040111*' USING PigStorage('|','-tagFile') ; 

mastergtrec = load 'master.txt' USING PigStorage(',','-tagFile'); 

mastergt = FOREACH mastergtrec GENERATE (chararray) UPPER($1) as opcdpc, (chararray) UPPER($2) as gtoptname,(chararray) UPPER($3) as gtoptcircle; 

mastergttup = FOREACH mastergt generate TOTUPLE(opcdpc,gtoptname,gtoptcircle) as mstgttup; 

cdrrecord = FOREACH cdrs GENERATE (chararray) UPPER($1) as aparty, (chararray) UPPER($2) as bparty,$3 as smssentdate,$4 as smssenttime,($29=='6' ? 'S' : 'F') as status,(chararray) UPPER($26) as srcgt,(chararray) UPPER($27) as destgt,($12=='405899136999995' ? 'MTSDEL-CDMA' : ($12=='919875089998' ? 'MTSRAJ-GSM' : ($12=='405899150999995' ? 'MTSCHN-CDMA' : $12))) as smscgt, (chararray)$0 as cdrfname,(chararray) $13 as prepost; 

filteredp2pcdrs = FILTER cdrrecord by smsiuc_udfs.pullp2pcdrs(aparty,bparty,srcgt,destgt) and status == 'S' and SUBSTRING(smssentdate,4,6) == '$MON'; 

groupp2pcdrs = GROUP filteredp2pcdrs by (srcgt,destgt,aparty,bparty,smscgt,status,prepost); 

distinctp2pcdrs= FOREACH groupp2pcdrs { 
uniq = DISTINCT filteredp2pcdrs.(srcgt,destgt,aparty,bparty,smscgt,status,prepost); 
GENERATE FLATTEN(group),COUNT(uniq) as cnt; 
}; 

p2preportmap = FOREACH distinctp2pcdrs GENERATE smsiuc_udfs.p2preport(srcgt,destgt,aparty,bparty,mastergttup),smscgt,status,prepost,cnt 

ответ

1

Это может быть сделан путем добавления фиктивного столбца, а затем группировки.

dummmy = Еогеасп p2preportmap генерировать 1, $ 0, $ 1 ....

сгруппированных = группа манекена по $ 0

+0

Невозможно понять , не могли бы вы объяснить ... – Amit

+0

проблема здесь у вас есть несколько записей в вашем отношении p2preportmap, вы должны объединить их в один, это может быть сделано командой выше или проще, сгруппировано = группа p2preportmap на 1; теперь вы можете сгруппировать в udf –

+0

Итак, вы хотите сказать, что я shud do group на mastergt, например dummy = foreach mastergtrec generate 1, opcdpc, gtoptname, gtoptcircle & then grouped = group dummy by opcdpc. – Amit

1

Позвольте мне дать вам пример у меня есть два соотношение A и B

A

1,2,3 
3,4,5 
4,5,6 

В

1 
2 
3 
1 
2 
3 
1 
2 
3 

Теперь я хочу python udf, который будет искать первый столбец вывода A print, как это показано ниже.

((1,{(1,2,3)})) 
((2,)) 
((3,{(3,4,5)})) 
((1,{(1,2,3)})) 
((2,)) 
((3,{(3,4,5)})) 
((1,{(1,2,3)})) 
((2,)) 
((3,{(3,4,5)})) 

Так первый я группа А по первой колонке, а затем сгруппировать его по 1, так что у меня есть Однорядовый

c = group A by $0 
e = group c by 1 

питона UDF что-то вроде ниже

def pythonudf(value,map): 
    print map 
    temp = None 
    for a in map: 
     if a[0] == value: 
      temp = a[1] 
    return value,temp 

теперь вы используете это udf

D = foreach B generate myudf.pythonudf($0,e.$1); 
+0

Спасибо за такое замечательное объяснение, я пытался сделать то же самое, но все же он не работает. когда я дамп группы ei получаю это '1 {(master_gt_spc.txt, {(master.txt, 9145, MTS, UPW), (master.txt, 919225, MTS, WB), (master.txt, 0101A0, MTS, TN), (master_gt_spc.txt, 03F0, МТС, KL), (master.txt, Ю.К., ИСДП, КО) ,, (master_gt_spc.txt, YD-INDRLY, МТС, DL)})} '. Когда я печатаю 'a [0]' он дает 'master.txt',' a [1] 'не печатает в UDF,' a [2] 'также не печатает. Python udf - это 'def map (srcgt, mastergttup): для tuplevalue в mastergttup: if tuplevalue [0] == srcgt: return tuplevalue [1]'. – Amit

+0

Выход не отображается по мере необходимости. – Amit

+0

похоже, что что-то не так с вашим отношением e, почему оно имеет master_gt_spc.txt и master.txt, это должно быть правильное значение srcgt? вы можете напечатать c, прежде чем группировать что-то пошло не так во время группировки. –

Смежные вопросы