2016-07-23 1 views
0

Je suis très nouveau à étincelle. Je suis en train de tirer la date et le message d'erreur de l'erreur suivante journalBesoin de tirer un message spécifique en utilisant étincelle

11 nov 09:44:53 www httpd [1933]: [error] [client 10.2.23.89] (36) Nom de fichier trop à long

11 nov 09:49:38 www httpd [2728]: [error] [client 10.2.23.128] (36) nom de fichier trop long

11 nov 10:14:23 www httpd [4530] : [erreur] [client 10.2.23.243] (36) Nom de fichier trop long

11 novembre 10:15:24 www httpd [4630]: [erreur] [client 10.2.23.42] (36) Nom de fichier trop long

11 novembre 12:05:07 www httpd [12062]: [error] [client 10.2.23.148] (36) Nom du fichier trop long

Ce mon script que je l'ai utilisé dans la coquille scala

val inputfile = sc.textFile("hdfs://localhost:8020/kirthi/errorlog.txt") 

val elog = inputfile.map(line => (line.substring(0, 6),line.substring(65, 83))) 

elog.collect() 

C'est la sortie que j'obtiens mais ce n'est pas comme prévu. Le message n'est pas complètement tiré dans tous les tuples. Depuis la longueur de chaque ligne de journal varie.

Array[(String, String)] = Array((Nov 11,File name too long), (Nov 11,)File name too lon), (Nov 11,)File name too lon), (Nov 11,File name too long), (Nov 11,6)File name too lo)) 

Mais je veux la sortie comme affiché ci-dessous

Array[(String, String)] = Array((Nov 11,File name too long), (Nov 11,File name too long), (Nov 11,File name too long), (Nov 11,File name too long), (Nov 11,File name too long)) 

Si j'augmente la longueur de la sous-chaîne, je frappais avec un tableau hors limites erreur d'attente.

+1

Ce plus d'une question regex qu'une question Spark, – marios

Répondre

1

Une façon évidente d'analyser le texte serait d'utiliser Expressions régulières, bien sûr. Dans ce cas, en supposant que la structure de ces enregistrements de journal est toujours quelque chose comme:

<date: MMM dd HH:mm:ss> www httpd[<number>]: [<level>] [client <IP>] (<number>)<text> 

Vous pouvez utiliser quelque chose comme:

val regex = "(\\w+ \\d+) [0-9:]+ www httpd\\[\\d+\\]: \\[\\w+\\] \\[.+\\] \\(\\d+\\)(.+)$".r 

qui correspond à cette structure et capturera la partie date et le texte à la fin, par exemple à l'aide de l'appariement de motifs:

val elog = inputfile.map { case regex(date, text) => (date, text) } 

PS Ce n'est pas vraiment une question Spark (vous avez la partie Spark à droite, en supposant que vous êtes d'accord pour collecter toutes les données du cluster vers votre application de pilote).

+0

Merci Tzach, Cela fonctionne très bien. Mais pourriez-vous s'il vous plaît m'expliquer si besoin de tirer cette ip [client 10.2.23.243] puis-je utiliser la même regex comme ci-dessus et aussi s'il vous plaît laissez-moi comment mapper la même chose, ce qui est nécessaire au lieu de (date, texte) . Merci – vasan

+0

Désolé, cela ne fonctionne pas vraiment de cette façon (vous ne devriez pas ajouter de nouvelles questions dans les commentaires ...), lisez un peu sur l'utilisation des expressions régulières dans Scala et vous serez en mesure de comprendre: http://www.scala-lang.org/api/2.11.5/index.html#scala.util.matching.Regex –