2012-03-27 3 views
1

Ich versuche, einen Teil der Zeichenfolge zu extrahieren und es in Spalten in HBase zu speichern.Speichern Sie einige Felder von PIG nach Hbase

Dateien Inhalt:

msgType1 Person xyz has opened Internet:www.google.com from IP:192.123.123.123 for duration 00:15:00 

msgType2 Person xyz denied for opening Internet:202.x.x.x from IP:192.123.123.123 reason:unautheticated 

msgType1 Person xyz has opened Internet:202.x.x.x from IP:192.123.123.123 for duration 00:15:00 

Muster von Nachrichten an msgType entspricht, wird festgelegt. Jetzt versuche ich den Namen, das Ziel, die Quelle, die Dauer usw. in hbase zu speichern.

Ich versuche, Skript in PIG, um diese Aufgabe zu erledigen. Aber ich bin bei der Extraktion Teil. (Extrahieren IP oder Website-Name von 'Internet: 202.x.x.x' Token innerhalb Zeichenfolge).

Ich versuchte regulären Ausdruck, aber es funktioniert nicht für mich. Regex alway diese Fehler werfen:

ERROR 1045: Could not infer the matching function for org.apache.pig.builtin.REGEX_EXTRACT as multiple or none of them fit. Please use an explicit cast. 

gibt es eine andere Art und Weise diese Werte zu extrahieren und speichern, um es zu hbase in PIG oder andere als Schwein?

Antwort

1

Wie verwenden Sie die Funktion REGEX_EXTRACT? Haben Sie die Funktion REGEX_EXTRACT_ALL gesehen? Gemäß der Dokumentation (http://pig.apache.org/docs/r0.9.2/func.html#regex-extract-all), sollte es so aussehen:

test = LOAD 'test.csv' USING org.apache.pig.builtin.PigStorage(',') AS (key:chararray, value:chararray); 
test = FOREACH test GENERATE FLATTEN(REGEX_EXTRACT_ALL (value, '(\\S+):(\\S+)')) as (match1:chararray, match2:chararray); 
DUMP test; 

Meine Datei, wie das ist :

+0

verwendet Regex wie: E = foreach D erzeugen REGEX_EXTRACT (Meldung, 'Internet: *') und : E = foreach D erzeugen REGEX_EXTRACT (Meldung, 'Internet: *', 2) und viele andere Variationen. – pradeep

+0

A = LOAD 'yourfile' mit PigStorage ('\ t') AS (Schlüssel: chararray, Nachricht: chararray); B = foreach A generiere REGEX_EXTRACT (Nachricht, 'Internet: *'); – pradeep

+0

Mit B = FOREACH ein GENERATE REGEX_EXTRACT_ALL (f1, '(. *) \: (. *)') AS (match1: chararray, match2: chararray); Es wirft Fehler: Fehler 1000: Fehler beim Parsen. Lexikalischer Fehler in Zeile 1, Spalte 57. Entdeckt: ":" (58), nach: "\ '(. *) \\" Details unter logfile:/home/pig_1.log Und mit B = FOREACH ein GENERATE REGEX_EXTRACT_ALL (f1, '(. *): (. *)') AS (match1: chararray, match2: chararray); Es wirft Fehler: - Fehler 1000: Fehler beim Parsen. "" In Zeile 1, Spalte 67. War eines von: Details bei logfile: /home/pig_1.log – pradeep

1

Ich weiß, es ist einfach zu faul und nicht den Schritt, aber Sie sollten wirklich eine user-defined function hier verwenden. Pig ist gut als Datenflusssprache und nicht viel anderes. Um also die volle Leistung zu erhalten, müssen Sie viele UDFs verwenden, um Text zu lesen und kompliziertere Operationen durchzuführen.

Die UDF nimmt eine einzelne Zeichenfolge als Parameter und gibt dann ein Tupel zurück, das (person, destination, source, duration) darstellt. Um es zu nutzen, müssen Sie tun:

A = LOAD ... 
... 
B = FOREACH A GENERATE MyParseUDF(logline); 
... 
STORE B INTO ... 

Sie nicht erwähnt, was Ihr HBase Zeilenschlüssel war, aber sicher sein, das ist das erste Element in der Beziehung vor der Lagerung.

+0

Ich versuchte UDFs, aber meine UDF funktionierte nicht propelly, Grunt immer durch einen Fehler beim Ausführen von UDF. – pradeep

+0

In einigen Fällen wurde das Ergebnis in Bag {(xyz), (Internet: www.google.com) (IP: 192.123.123.123)} zurückgegeben, und das kann in hbase gespeichert werden. Ich benutze Schwein - 0.8.1 CDH3 Version – pradeep

+0

Ich habe diese Aussage nicht bekommen, "aber sicher sein, dass das erste Element in der Beziehung vor dem Speichern ist." I ... – pradeep

Verwandte Themen