

# El SerDe de Grok
<a name="grok-serde"></a>

El SerDe de Grok Logstash es una biblioteca con un conjunto de patrones especializados para la deserialización de archivos de texto sin estructurar, normalmente registros. Cada patrón de Grok es una expresión regular con nombre. Puede identificar y volver a utilizar estos patrones de deserialización según sea necesario. De ese modo resulta más sencillo utilizar Grok en comparación con el uso de expresiones regulares. Grok proporciona un conjunto de [patrones predefinidos](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns). También puede crear patrones personalizados.

## Nombre de la biblioteca de serialización
<a name="library-name"></a>

El nombre de la biblioteca de serialización de Grok SerDe es `com.amazonaws.glue.serde.GrokSerDe`.

## Cómo utilizar SerDe Grok
<a name="grok-serde-using"></a>

Para especificar el SerDe de Grok al crear una tabla en Athena, utilice la cláusula `ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe'` seguida de la cláusula `WITH SERDEPROPERTIES` que especifica los patrones que concuerdan con los datos, donde:
+ La expresión `input.format` define los patrones que concuerdan con los datos. Esto es necesario.
+ La expresión `input.grokCustomPatterns` define un patrón personalizado con nombre, que posteriormente puede utilizar dentro de la expresión `input.format`. Es opcional. Para incluir varias entradas de patrones en la expresión `input.grokCustomPatterns`, sepárelas con el carácter de escape para nueva línea (`\n`), de esta forma: `'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')`.
+ Las cláusulas `STORED AS INPUTFORMAT` y `OUTPUTFORMAT` son obligatorias.
+ La cláusula `LOCATION` especifica un bucket de Amazon S3 que puede contener varios objetos de datos. Todos los objetos de datos del bucket se deserializan para crear la tabla.

## Ejemplos
<a name="examples"></a>

Los ejemplos en esta sección se basan en la lista de patrones de Grok predefinidos. Para obtener más información, consulte [grok-patterns](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns) en GitHub.com.

### Ejemplo 1
<a name="example-1"></a>

En este ejemplo se utilizan datos de origen de entradas de registro de correo Postfix guardadas en `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>
```

La siguiente instrucción crea una tabla en Athena llamada `mygroktable` a partir de los datos de origen, usando un patrón personalizado y los patrones predefinidos que especifique:

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

Comience con un patrón, como `%{NOTSPACE:column}`, para asignar primero las columnas y después especialícelas si es necesario.

### Ejemplo 2
<a name="example-2"></a>

En el siguiente ejemplo se crea una consulta para registros Log4j. Los registros de ejemplo tienen las entradas en este formato:

```
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
```

Para consultar estos datos de registros haga lo siguiente:
+ Añada el patrón de Grok al `input.format` de cada columna. Por ejemplo, para `timestamp`, añada `%{TIMESTAMP_ISO8601:timestamp}`. Para `loglevel`, añada `%{LOGLEVEL:loglevel}`.
+ Asegúrese de que el patrón de `input.format` coincida exactamente con el formato del log mapeando los guiones (`-`) y las comas que separan las entregas en el formato de log.

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

### Ejemplo 3
<a name="example-3"></a>

En la siguiente declaración `CREATE TABLE` de los [registros de acceso al servidor de Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html) muestra la expresión `'input.grokCustomPatterns'` que contiene dos entradas de patrón, separadas por el carácter de escape de nueva línea (`\n`), como se muestra en este fragmento de la consulta de ejemplo: `'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'
```

## Véase también
<a name="grok-serde-see-also"></a>
+ [Comprensión de los patrones Grok](https://edgedelta.com/company/blog/what-are-grok-patterns) (sitio web externo)
+ [Patrones integrados](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#classifier-builtin-patterns) (*Guía del usuario de AWS Glue*)