2016-05-09 5 views
0

10 zu übergeben Ich habe master.txt, die 10K Datensätze hat, so wird jede Zeile davon ein Tupel sein & ganze derselben muss an Python UDF übergeben werden. Da es mehrere Datensätze enthält, wird beim Speichern von p2preportmap der folgende Fehler angezeigt. Bitte helfenNicht möglich, Schwein Tupel zu Python UDF

Fehler ist wie folgt:

kann nicht Iterator für alias p2preportmap öffnen. Backend-Fehler: org.apache.pig.backend.executionengine.ExecException: Fehler 0: Skalar hat mehr als eine Zeile in der Ausgabe. 1.: (010301, MTS, MM), 2. : (010B06, MTS, TN) (gemeinsame Ursache: "JOIN", dann "FOREACH ... GENERATE foo.bar" sollte "foo :: bar" sein)

Pig Script ist wie folgt:

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 

Antwort

1

Dies wird durch das Hinzufügen einer Dummy-Spalte durchgeführt werden kann und die Gruppierung dann.

dummmy = foreach p2preportmap 1, erzeugen $ 0, $ 1 ....

gruppiert = Gruppen Dummy mich von $ 0

+0

Unfähig zu verstehen , können Sie bitte erklären ... – Amit

+0

Problem hier ist, haben Sie mehrere Datensätze in Ihrer Beziehung p2preportmap Sie sollten sie zu einem kombinieren dies kann durch obigen Befehl oder einfacher getan werden ist gruppiert = Gruppe p2preportmap von 1; Jetzt können Sie gruppiert in die udf gehen –

+0

Also du meinst zu sagen, dass ich Gruppe auf mastergt shud wie dummy = foreach mastergtrec 1, opcdpc, gtoptname, gtopcircle & dann gruppiert = Gruppe dummy von opcdpc. – Amit

1

Lassen Sie geben Ihnen ein Beispiel, das ich habe zwei Beziehung A und B

A

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

B

1 
2 
3 
1 
2 
3 
1 
2 
3 

Jetzt möchte ich eine Python-udf, die die erste Spalte der A-Ausgabe etwa wie folgt aussehen würde.

((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)})) 

Also zuerst i Gruppe A durch erste Spalte und dann die Gruppe um 1, so dass ich einreihige

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

Python UDF haben, ist so etwas wie unten

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

jetzt Sie verwenden dieses udf

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

Danke für solch eine wunderbare Erklärung, ich habe versucht, das gleiche zu tun, aber es funktioniert immer noch nicht. Wenn ich dump gruppe ei bekomme diese '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, MTS, KL), (master.txt, YK, MTSI, KO) ,, (master_gt_spc.txt, YD-INDRLY, MTS, DL)})}. Wenn ich 'a [0]' drucke, gibt es 'master.txt',' a [1] 'druckt nicht in der UDF,' a [2] 'druckt auch nicht. Python udf ist 'def map (srcgt, mastergttup): für tuplevalue in mastergttup: if tuplevalue [0] == srcgt: return tuplevalue [1]'. – Amit

+0

Die Ausgabe wird nicht wie erforderlich gemappt. – Amit

+0

sieht aus wie etwas ist falsch mit Ihrer Beziehung e Warum ist es mit master_gt_spc.txt und master.txt sollte srcgt Werte sein, oder? Kannst du c vor dem Gruppieren ausdrucken, ist beim Gruppieren etwas schief gelaufen. –