2017-03-08 2 views
1

Ich habe die folgenden Testdaten.Anzahl der Werte über Felder in Pig

A B C 

M O 

M M M 

M M M 

N  O 

P  N 

Ich mag würde die Gesamtzahl der Einträge in dieser Probe Testdaten erhalten d.h 12

ich den Code unten habe das gleiche zu tun, aber ich bin ein falsches Ergebnis.

Jede Hilfe zur Behebung wäre hilfreich.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 
values = FOREACH test GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
counting = FOREACH grp GENERATE group, COUNT(values.A)+COUNT(values.B)+COUNT(values.C); 

Dies gibt Antwort als 15 statt 12.

Ich möchte auch die Zählung jedes dieser Werte erhalten, wie M = 7, N = 2, O = 2, P = 1. Ich habe den folgenden Code geschrieben.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 
values = FOREACH test GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
    A = FOREACH grp { 
B =FILTER test.A=='M' OR test.B=='M' OR test.C=='M'; 
GENERATE group, COUNT(B); 
}; 

Ich erhalte eine Fehlermeldung „Scalar hat mehr als eine Zeile in der Ausgabe“.

Antwort

2

Sie zählen auch die Spaltennamen in Ihrer endgültigen Zählung.Modifizieren Sie das Skript, um die erste Zeile zu ignorieren und dann nach und zu zählen.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 

ranked = rank test; 
test1 = Filter ranked by ($0 > 1); --Note:rank_test should work. 

values = FOREACH test1 GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
counting = FOREACH grp GENERATE group, COUNT(values.A)+COUNT(values.B)+COUNT(values.C); 
+0

Was ist rank_test hier? –

+0

Die Antwort sollte grundsätzlich die leeren Felder ignorieren, um die Anzahl der im Datensatz vorhandenen Felder anzugeben (12). –

+0

Rank weist Zeilennummern für die Datensätze in der Relation zu. Rank_test ist eine neue Spalte mit Zeilennummer. Dadurch werden die Spaltenüberschriften entfernt. Wenn wir filtern, verwenden wir rank_test> 1, um die erste Zeile A, B, C.Try running zu entfernen das Skript und sehen, was Sie bekommen.Es sollte Ihnen geben 12. –

Verwandte Themen