7
votes

Regex pour l'accès Connexion à Hive Serde

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.

xxx

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).

xxx

Je ne suis pas très expérimenté avec regex. Quelqu'un peut-il m'aider avec cela?


0 commentaires

3 Réponses :


1
votes

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 http://www.regexplanet.com/simple/index.html si vous remplacez [^ [ ] 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"


0 commentaires

7
votes

J'utilise Rubular pour tester mon regex. Vous pouvez également utiliser cette expression xxx

Vous obtenez la sortie suivante xxx


0 commentaires

13
votes

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


5 commentaires

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.