Je veux extraire (IP, demandeurs, horodatage) à partir des journaux d'accès à la charge de la base de données HIVE. Une ligne du journal d'accès est la suivante.
p> J'ai essayé avec la suite et plusieurs variations de regex sans succès. (La table chargée est avec toutes les valeurs NULL indiquant que la regex ne correspond pas à l'entrée). P> p> Je ne suis pas très expérimenté avec regex. Quelqu'un peut-il m'aider avec cela? P> p>
3 Réponses :
Not Looth-Preuve, mais étant donné qu'il s'agit d'un fichier journal dans un format connu, les éléments suivants doivent alors fonctionner (non testé dans la ruche, mais fonctionne avec grep -e code> et avec
[^ [ ] code> avec
[^ \ [] code> et
[^]] code> avec
[^ \]] code>). Suppose que vous voulez seulement les trois valeurs que vous avez spécifiquement mentionnées.
"input.regex" = "([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)[^[]+\[([^]]+)\][^/]+([^ ]+).+"
"output.format.string" = "%1$s %2$s %3$s"
J'utilise Rubular pour tester mon regex.
Vous pouvez également utiliser cette expression Vous obtenez la sortie suivante p>
Utilisez le double '\' et '. *' À la fin (c'est important!):
CREATE EXTERNAL TABLE access_log ( `ip` STRING, `time_local` STRING, `method` STRING, `uri` STRING, `protocol` STRING, `status` STRING, `bytes_sent` STRING, `referer` STRING, `useragent` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( 'input.regex'='^(\\S+) \\S+ \\S+ \\[([^\\[]+)\\] "(\\w+) (\\S+) (\\S+)" (\\d+) (\\d+) "([^"]+)" "([^"]+)".*' ) STORED AS TEXTFILE LOCATION '/tmp/access_logs/';
Pouvez-vous expliquer la raison de «utiliser le double» \ 'et'. * 'À la fin'
Ceci est beaucoup plus important que le crédit. Le \\ est nécessaire car la regex est à l'intérieur d'une chaîne qui fait partie d'une requête SQL ... Donc, afin d'obtenir un \ s, vous devez taper \\ s afin que vous obteniez une réelle (c'est-à-dire échappée) backslash dans le cadre de la commande. \\ s + associera un ou plusieurs caractères non-espaces. \ S * est simplement d'essayer de faire correspondre 0 ou plusieurs caractères majuscules.
Le. * À la fin est juste pour le nettoyage, au cas où vous avez manqué quelque chose avec vos groupes correspondants.
Le double \ a sauvé ma journée. Merci beaucoup.
Je souhaite que la ruche, Aws Athena et d'autres documents incluent cet exemple.