Je cherche une regex qui peut être introduite à une "table de création d'une table externe" de la ruche ql sous la forme de la condition est que les journaux dans les fichiers que le Regexserde doit être la lecture sont du formulaire suivant: P> 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';
3 Réponses :
Il semble y avoir un certain nombre de problèmes avec votre regex.
Premièrement, retirez vos deux crochets carrés. P>
second, troisième, vous voulez correspondre quatrième, cinquième, si cela vous donnait des correspondances à une seule ligne avec Je suggérerais d'essayer de faire correspondre juste vous Impossible d'ajouter Si cela allait travailler la regex que vous voulez serait: P> panne: p> \ a code> et
\ z code> /
\ z code> doit correspondre au début et à la fin de l'entrée em>, pas seulement une ligne. Changer
\ a code> à
^ code> pour correspondre début de ligne mais ne fort> change
\ z code> à
$ code> comme vous voulez réellement faire correspondre la fin de saisie dans ce cas. p>
(. *?) code>, pas (. *)? code>. Le premier modèle est ungredy, tandis que le deuxième modèle est gourmand mais facultatif. Il aurait dû correspondre à votre entrée entière à la fin, car vous l'avez autorisée à être suivie d'une fin de saisie. P>
. Code> ne correspond pas à de nouvelles lignes. Vous pouvez utiliser
(\ s | \ s) code> à la place ou
([x] | [^ x]) code>, etc., une paire de matchs gratuits. P >
\ a code> et
\ z code> /
\ z code> puis l'entrée était une ligne unique aussi, comme vous étiez ancrage de la chaîne entière. P>
\ n code> si rien ne correspond alors que les nouvelles lignes ne sont pas incluses. P>
/ m code> à la fin, car le regex n'inclut pas les délimiteurs. Il essaiera de faire correspondre les caractères littéraux
/ m code>, c'est pourquoi vous n'avez pas de match. P>
"^([\\s\\S]+)^\\d"
Je ne sais pas beaucoup sur la ruche, mais la regex suivante, ou une variation formatée pour les chaînes Java, pourrait fonctionner: Ceci peut être vu correspondant à vos échantillons de données ici: http://rubular.com/r/tqp9ibp4ji p> Une panne: p> Les trois premiers groupes de capture sont assez simples. P> Le dernier pourrait être un peu étrange, mais cela fonctionne sur Rubular. Une panne: p> i utilisé
(\ d {4} - \ d \ d- \ d: \ d \ d, \ d +) code> la date et l'heure (capture Groupe 1) Li>
\ [([a-za-z _-] +) \] code> le niveau de journalisation (groupe de capture 2) li>
([\ w-w-] +) code> L'ID de requête (groupe de capture 3) li>
((?: [^ \ n \ r] +) (?: [\ n \ r] {1,2} \ s [^ \ n \ r] +) *) code> Le message potentiellement multiligne (groupe de capture 4) li>
ul>
[^ \ n \ r] code> au lieu du
. Code> car il ressemble à Regexserde code> permet le
. code> correspond à de nouvelles lignes ( LINK ): P>
// Excerpt from https://github.com/apache/hive/blob/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2/RegexSerDe.java#L101
if (inputRegex != null) {
inputPattern = Pattern.compile(inputRegex, Pattern.DOTALL
+ (inputRegexIgnoreCase ? Pattern.CASE_INSENSITIVE : 0));
} else {
inputPattern = null;
}
Après Java Regex peut aider:
(\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2},\d{1,3})\s+(\[.+?\])\s+(.+?)\s+([\s\S\s]+?)(?=\d{4}-\d{1,2}-\d{1,2}|\Z)
(\ d {4} - \ d {1,2} - \ d {1,2} \ s + \ d {1,2}: \ d {1,2}: \ d {1,2}, \ d {1,3}) code> li>
- 2e groupe de capture
(\ [. +? \]) code> li>
- 3ème groupe de capture
(. +?) code> li>
- 4ème groupe de capture
([\ s \ s] +?) code>. li>
ul> (? = \ d {4} - \ d {1,2} - \ d {1,2} - \ d {1,2} | \ z) code> Lookahead positif - affirmez que la regex ci-dessous Peut être assorti.1st Alternative: \ d {4} - \ d {1,2} - \ d {1,2} - \ d {1,2} - \ d {1,2} code> .2nd alternative: \ z code> ASSERT POSITION à la fin de la chaîne. P> référence http://regex101.com/ p> p>
Pourquoi ne vous rendez-vous pas ce bébé? (lol ce n'est même pas un verbe, mais stil ... ne pouviez-vous pas définir chacun de ceux-ci vers un tableau? Puis la première ligne sera la clé 0, deuxième élément multiligne serait dans 1, les deux autres sur 2 et 3 sur 2 et 3 et vous pouvez les appeler comme vous le souhaitez)