ich für einen regulären Ausdruck suchen, die eine eingespeist werden kann „erstellen externe Tabelle“ statement of Hive QL in Form vonHive RegexSerDe mehrzeilige Log passende
"input.regex"="the regex goes here"
Die Bedingung ist, dass die Protokolle in den Dateien, die die RegexSerDe muss Lesung ist in der folgenden Form sein:
2013-02-12 12:03:22,323 [DEBUG] 2636hd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks. This one does not have a linebreak. It just has spaces on the same line.
2013-02-12 12:03:24,527 [DEBUG] 265y7d3e-432g-dfg3-dwq3-y4dsfq3ew91b Some other message that can contain any special character, including linebreaks. This one does not have one either. It just has spaces on the same line.
2013-02-12 12:03:24,946 [ERROR] 261rtd3e-432g-dfg3-dwq3-y4dsfq3ew91b Some message that can contain any special character, including linebreaks.
This is a special one.
This has a message that is multi-lined.
This is line number 4 of the same log.
Line 5.
2013-02-12 12:03:24,988 [INFO] 2632323e-432g-dfg3-dwq3-y4dsfq3ew91b Another 1-line log
2013-02-12 12:03:25,121 [DEBUG] 263tgd3e-432g-dfg3-dwq3-y4dsfq3ew91b Yet another one line log.
ich den folgenden erstellen externe Tabelle Code verwenden:
CREATE EXTERNAL TABLE applogs (logdatetime STRING, logtype STRING, requestid STRING, verbosedata STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES
(
"input.regex" = "(\\A[[0-9:-] ]{19},[0-9]{3}) (\\[[A-Z]*\\]) ([0-9a-z-]*) (.*)?(?=(?:\\A[[0-9:-] ]{19},[0-9]|\\z))",
"output.format.string" = "%1$s \\[%2$s\\] %3$s %4$s"
)
STORED AS TEXTFILE
LOCATION 'hdfs:///logs-application';
Hier ist die Sache:
Es ist in der Lage, alle ersten Zeilen jedes Protokolls zu ziehen. Aber nicht die anderen Zeilen von Protokollen, die mehr als eine Zeile haben. Ich habe versucht, alle Links, ersetzt \z
mit \Z
am Ende, ersetzt \A
mit ^
und \Z
oder \z
mit $
, nichts hat funktioniert. Fehle ich etwas in der %4$s
output.format.string? oder verwende ich die Regex nicht richtig?
Was die Regex tut:
Es entspricht den Zeitstempel zuerst, gefolgt von dem Protokolltyp (DEBUG
oder INFO
oder was auch immer), dann der ID
(Mischung aus Kleinbuchstabe Buchstaben, Zahlen und Bindestrichen) von ANYTHING gefolgt, bis der nächste Zeitstempel gefunden wird oder bis das Ende der Eingabe mit dem letzten Protokolleintrag übereinstimmt. Ich habe auch versucht, die /m
am Ende hinzufügen, in diesem Fall hat die generierte Tabelle alle NULL-Werte.
warum ordnen Sie das Baby nicht an? (lol das ist nicht einmal ein Verb, aber stil ... könntest du nicht jeden auf ein Array setzen? dann ist die erste Zeile der Schlüssel 0, der zweite mehrzeilige Gegenstand wäre in 1, die anderen zwei in 2 und 3) und du kannst sie anrufen wie du willst) – user1576978