9
votes

HIVE REGEXSERDE MOYLINE BOG correspondant

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 xxx pré>

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';


1 commentaires

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)


3 Réponses :


1
votes

Il semble y avoir un certain nombre de problèmes avec votre regex.

Premièrement, retirez vos deux crochets carrés. P>

second, \ 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>

troisième, vous voulez correspondre (. *?) 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>

quatrième, . 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 >

cinquième, si cela vous donnait des correspondances à une seule ligne avec \ 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>

Je suggérerais d'essayer de faire correspondre juste \ n code> si rien ne correspond alors que les nouvelles lignes ne sont pas incluses. P>

vous Impossible d'ajouter / 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>

Si cela allait travailler la regex que vous voulez serait: P> xxx pré>

panne: p>

"^([\\s\\S]+)^\\d"


0 commentaires

0
votes

Je ne sais pas beaucoup sur la ruche, mais la regex suivante, ou une variation formatée pour les chaînes Java, pourrait fonctionner: xxx pré>

Ceci peut être vu correspondant à vos échantillons de données ici:

http://rubular.com/r/tqp9ibp4ji p>

Une panne: p>

  • (\ 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>

    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> xxx pré>

    i utilisé [^ \ 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;
    }
    


0 commentaires

1
votes

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)
  • 1er groupe de capture (\ 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>


0 commentaires