2016-10-12 4 views
2

Angenommen, ich eine Gruppe von Zielwörter haben:Wie kann ich die Anzahl der Zeilen, die eine bestimmte Zeichenfolge enthalten, im Schwein zählen?

a b c d 

und eine Eingabedatei:

a d f s g e 
12399 
c a d i f 
a 2 

dann sollte ich zurück:

a 3 
b 0 
c 1 
d 2 

Wie kann ich in Schwein das tun? Vielen Dank!

+0

Ist die Anzahl der Zielwörter fixiert I; Eine ähnliche Frage beantwortet http://stackoverflow.com/questions/39962608/pig-lati n-word-count –

+0

Ja, die gleiche Frage, die Anzahl der Wörter ist vielleicht ein verwirrender Name ... was ist, wenn die Anzahl der Zielwörter ziemlich groß ist? – HM9527

+0

Sie können diese Wörter entweder in einer anderen Relation speichern, die Eingabe mit der Relation verbinden, Ihr Schweineschrift- stück zähmen oder parametrisieren und das Suchwort aus einem Stapelskript in einer Schleife übergeben und die Ergebnisse abrufen. –

Antwort

1

Entfernen Sie zuerst die doppelten Wörter aus jeder Zeile und führen Sie dann die Wortzahl aus.
Pig Schritte:

REGISTER 'udf-1.0-SNAPSHOT.jar' 
define tuple_set com.ts.pig.UniqueRecords(); 
data = load '<file>' using PigStorage(); 

entfernen doppelte Wörter aus jeder Zeile

unique= foreach data generate tuple_set($0) as line; 
words= foreach unique generate flatten(TOKENIZE(line,' ')) as word; 
grouped = group words BY word; 
count= foreach grouped GENERATE group, COUNT(words); 
dump count; 

Pig UDF Beispielcode:

/** 
* This udf removes duplicate words from line 
*/ 
public class UniqueRecords extends EvalFunc<String> { 
    @Override 
    public String exec(Tuple tuple) throws IOException { 
     if (tuple == null || tuple.size() == 0) 
      return null; 
     String[] splits=tuple.get(0).toString().split(" "); 
     Set<String> elements = new HashSet<String>(Arrays.asList(splits)); 
     StringBuilder sb = new StringBuilder(); 
     for(String element:elements){ 
      sb.append(element+" "); 
     } 
     return sb.toString(); 
    } 
} 
+0

Ich verstehe eigentlich nicht ganz, was nach der Tokenisierung passiert. Ich habe versucht, 'A = FOREACH input GENERATE FLATTEN (TOKENIZIEREN (Zeile)) als Token zu machen; B = FOREACH A GENERATE (Token stimmt mit 'irgendein Schlüsselwort' überein? 1: 0); 'Ich hatte erwartet, die Anzahl der Zeilen zu erhalten, die dieses 'irgendein Schlüsselwort' enthält, aber es könnte tatsächlich die Nummer dieses 'irgendein Schlüsselwortes' ergeben erklären Sie bitte, wie genau meine zwei Codezeilen funktionieren? – HM9527

+0

Ich würde vorschlagen, dass Sie Schwein Grundlagen lesen http://pig.apache.org/docs/r0.16.0/start.html –

+0

Vielen Dank! Habe zwei Tage damit verbracht, sie gründlich zu lesen. – HM9527

Verwandte Themen