SerDe Grok
La bibliothèque Logstash Grok SerDe contient un ensemble de modèles spécialisés pour la désérialisation de données texte non structurées, généralement des fichiers journaux. Chaque modèle Grok est une expression régulière nommée. Vous pouvez identifier et réutiliser ces modèles de désérialisation selon vos besoins. Il est ainsi plus facile d'utiliser Grok que des expressions régulières. Grok fournit un ensemble de modèles prédéfinis
Nom de la bibliothèque de sérialisation
La bibliothèque de sérialisation du SerDe Grok est nommée com.amazonaws.glue.serde.GrokSerDe.
Comment utiliser le SerDe Grok
Pour spécifier la bibliothèque Grok SerDe lors de la création d'une table dans Athena, utilisez la clause ROW FORMAT
SERDE 'com.amazonaws.glue.serde.GrokSerDe', suivie de la clause WITH
SERDEPROPERTIES qui spécifie les modèles de correspondance de vos données, où :
-
L'expression
input.formatdéfinit les modèles de correspondance du fichier de données. C’est obligatoire. -
L'expression
input.grokCustomPatternsdéfinit un modèle personnalisé nommé, que vous pouvez ensuite utiliser au sein de l'expressioninput.format. Ce nom est facultatif. Pour inclure plusieurs entrées dans le modèle d' expressioninput.grokCustomPatterns, utilisez le caractère d'échappement de saut de ligne (\n) pour les séparer, comme suit :'input.grokCustomPatterns'='INSIDE_QS ([^\"]*).\nINSIDE_BRACKETS ([^\\]]*)') -
Les clauses
STORED AS INPUTFORMATetOUTPUTFORMATsont obligatoires. -
La clause
LOCATIONspécifie un compartiment Simple Storage Service (Amazon S3), qui peut contenir plusieurs objets de données. Tous les objets de données du compartiment sont désérialisés pour créer la table.
Exemples
Les exemples de cette section s’appuient sur la liste de modèles Grok prédéfinis. Pour plus d’informations, consultez grok-patterns
Exemple 1
Cet exemple utilise la source des données d'entrées maillog Postfix enregistrées dans s3://amzn-s3-demo-bucket/groksample/.
Feb 9 07:15:00 m4eastmail postfix/smtpd[19305]: B88C4120838: connect from unknown[192.168.55.4]
Feb 9 07:15:00 m4eastmail postfix/smtpd[20444]: B58C4330038: client=unknown[192.168.55.4]
Feb 9 07:15:03 m4eastmail postfix/cleanup[22835]: BDC22A77854: message-id=<31221401257553.5004389LCBF@m4eastmail.example.com>
L'instruction suivante crée une table dans Athena appelée mygroktable depuis le fichier de données source, à l'aide d'un modèle personnalisé et des modèles prédéfinis que vous spécifiez :
CREATE EXTERNAL TABLE `mygroktable`( syslogbase string, queue_id string, syslog_message string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.grokCustomPatterns' = 'POSTFIX_QUEUEID [0-9A-F]{7,12}', 'input.format'='%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/groksample/';
Commencez par un modèle tel que %{NOTSPACE:column} pour mapper les colonnes, puis spécialisez les colonnes si nécessaire.
Exemple 2
Dans l'exemple suivant, vous créez une requête pour les journaux Log4j. Le format des entrées de l'exemple de journal est le suivant :
2017-09-12 12:10:34,972 INFO - processType=AZ, processId=ABCDEFG614B6F5E49, status=RUN,
threadId=123:amqListenerContainerPool23P:AJ|ABCDE9614B6F5E49||2017-09-12T12:10:11.172-0700],
executionTime=7290, tenantId=12456, userId=123123f8535f8d76015374e7a1d87c3c, shard=testapp1,
jobId=12312345e5e7df0015e777fb2e03f3c, messageType=REAL_TIME_SYNC,
action=receive, hostname=1.abc.def.com
Pour interroger les données de ce journal :
-
Ajoutez le modèle Grok au format
input.formatpour chaque colonne. Par exemple, pourtimestamp, ajoutez%{TIMESTAMP_ISO8601:timestamp}. Pourloglevel, ajoutez%{LOGLEVEL:loglevel}. -
Assurez-vous que le modèle défini dans
input.formatcorrespond exactement au format du journal, en mappant les tirets (-) et les virgules qui séparent les entrées dans le format du journal.CREATE EXTERNAL TABLE bltest ( timestamp STRING, loglevel STRING, processtype STRING, processid STRING, status STRING, threadid STRING, executiontime INT, tenantid INT, userid STRING, shard STRING, jobid STRING, messagetype STRING, action STRING, hostname STRING ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( "input.grokCustomPatterns" = 'C_ACTION receive|send', "input.format" = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} - processType=%{NOTSPACE:processtype}, processId=%{NOTSPACE:processid}, status=%{NOTSPACE:status}, threadId=%{NOTSPACE:threadid}, executionTime=%{POSINT:executiontime}, tenantId=%{POSINT:tenantid}, userId=%{NOTSPACE:userid}, shard=%{NOTSPACE:shard}, jobId=%{NOTSPACE:jobid}, messageType=%{NOTSPACE:messagetype}, action=%{C_ACTION:action}, hostname=%{HOST:hostname}" ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/samples/';
Exemple 3
Dans l’exemple suivant relatif aux journaux d’accès aux serveurs Amazon S3, l’instruction CREATE TABLE comporte l’expression 'input.grokCustomPatterns', qui contient deux entrées de modèle séparées par le caractère d’échappement de saut de ligne (\n), comme illustré dans cet extrait de l’exemple de requête : 'input.grokCustomPatterns'='INSIDE_QS
([^\"]*).\nINSIDE_BRACKETS
([^\\]]*)')
CREATE EXTERNAL TABLE `s3_access_auto_raw_02`(
`bucket_owner` string COMMENT 'from deserializer',
`bucket` string COMMENT 'from deserializer',
`time` string COMMENT 'from deserializer',
`remote_ip` string COMMENT 'from deserializer',
`requester` string COMMENT 'from deserializer',
`request_id` string COMMENT 'from deserializer',
`operation` string COMMENT 'from deserializer',
`key` string COMMENT 'from deserializer',
`request_uri` string COMMENT 'from deserializer',
`http_status` string COMMENT 'from deserializer',
`error_code` string COMMENT 'from deserializer',
`bytes_sent` string COMMENT 'from deserializer',
`object_size` string COMMENT 'from deserializer',
`total_time` string COMMENT 'from deserializer',
`turnaround_time` string COMMENT 'from deserializer',
`referrer` string COMMENT 'from deserializer',
`user_agent` string COMMENT 'from deserializer',
`version_id` string COMMENT 'from deserializer')
ROW FORMAT SERDE
'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
'input.format'='%{NOTSPACE:bucket_owner} %{NOTSPACE:bucket} \\[%{INSIDE_BRACKETS:time}\\] %{NOTSPACE:remote_ip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} \"?%{INSIDE_QS:request_uri}\"? %{NOTSPACE:http_status} %{NOTSPACE:error_code} %{NOTSPACE:bytes_sent} %{NOTSPACE:object_size} %{NOTSPACE:total_time} %{NOTSPACE:turnaround_time} \"?%{INSIDE_QS:referrer}\"? \"?%{INSIDE_QS:user_agent}\"? %{NOTSPACE:version_id}',
'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket'
Consultez aussi
-
Understanding Grok Patterns
(site web externe) -
Built-in patterns (Guide d’utilisation d’AWS Glue)