2016-03-30 15 views
1

Ich brauche folgende Ausgabe.Wie CASE-Anweisung in Schwein?

NE 50 
SE 80 

Ich benutze Schwein Abfrage, um das Land basierend auf Zone zu zählen.

c1 = group country by zone; 
c2 = foreach c1 generate COUNT(country.zone), (
case country.zone 
when 1 then 'NE' 
else 'SE' 
); 

Aber ich bin nicht in der Lage meine Ausgabe zu erreichen. Ich erhalte einen Fehler wie den folgenden:

2016-03-30 13:57:16,569 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1039: (Name: Equal Type: null Uid: null)incompatible types in Equal Operator left hand side:bag :tuple(zone:int) right hand side:int 
Details at logfile: /home/cloudera/pig_1459370643493.log 

Aber ich konnte mit der folgenden Abfrage tun.

c2 = foreach c1 generate group, COUNT(country.zone); 

Dies wird folgende Ausgabe geben:

(1,50) 
(2,80) 

Wie kann ich NE statt 1 und SE anstelle von 2? Ich dachte, CASE würde helfen, aber ich bekomme Fehler. Kann jemand helfen?

Antwort

3

EDIT

Pig 0.12.0 Version unterstützt jetzt CASE-Ausdruck.

c2 = FOREACH c1 GENERATE (CASE group 
           WHEN 1 THEN 'NE' 
           WHEN 2 THEN 'SE' 
           WHEN 3 THEN 'AE' 
           ELSE 'VR' END), COUNT(country.zone); 

Ältere Versionen Pig

Schwein keinen Fall statement.Your beste Option ist UDF.If die Gruppenwerte zu verwenden, sind auf nur zwei beschränkt, dann können Sie bincond Operator die überprüfen Wert

Wenn Sie mehrere Werte haben, verwenden Sie diese.Ich habe Testwerte verwendet, um die Ausgabe zu generieren.

Eingang

Input

c2 = FOREACH c1 GENERATE (group == 1 ? 'NE' : 
         (group == 2 ? 'SE' : 
         (group == 3 ? 'AE' : 'VR'))), COUNT(country.zone); 

Ausgabe

Output

+0

Was passiert, wenn ich die Ausgabe müssen Sie wie folgt vor: NE 50 SE 80 AE 50 VR 40 Wie verwende ich foreach-Anweisung, um die Zone für alle Viere zu vergleichen und Länder basierend darauf zu zählen? – bthapa

+0

@BXT was sind die entsprechenden Werte für NE, SE AE, VR? 1,2,3,4? –

+0

Vielen Dank für Ihre so klare Erklärung. Ich habe CASE-Anweisung wie in Hive verwendet und war verwirrt. Ich schätze deine Arbeit sehr. Haben Sie auch einen Blog für Big Data und Hadoop, so dass es für mich einfach ist, als Anfänger zu lernen? – bthapa

0

In Pig 12 und höher können Sie case-Anweisung in der Schweine verwenden

In Ihrem Fall ist country.zone eine Tasche und Sie können es nicht mit einem int vergleichen

0

Mit der oben genannten Antwort erhalten diesen Fehler.

mismatched input ')' expecting END. 

So ein Arbeitscode Aktualisierung:

c2 = FOREACH c1 GENERATE (CASE group 
          WHEN 1 THEN 'NE' 
          WHEN 2 THEN 'SE' 
          WHEN 3 THEN 'AE' 
          ELSE 'VR' END), COUNT(country.zone); 

Ausgang:

(NE, 50) 
(SE, 80) 
(AE, 30)