¿Cómo soluciono el error de RegexSerDe «Number of matching groups doesn't match the number of columns» en Amazon Athena?

2 minutos de lectura
0

He creado una tabla de Amazon Athena con RegexSerDe. Cuando consulto la tabla, aparece este error: «Number of matching groups doesn't match the number of columns».

Resolución

Para solucionar este error, asegúrese de que el número de grupos de captura en el patrón de expresiones regulares coincida con el número de campos definidos al crear la tabla en Athena. Por ejemplo, veamos esta fila de datos de entrada:

64.xxx.xx.xx - - [07/Jul/2020:16:06:51 -0800] "GET /twiki/bin/rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523

La fila tiene siete campos. Este es el patrón correcto de expresiones regulares:

^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$

Nota: RegexSerDe sigue el estándar de Java. Como la barra invertida es un carácter de escape de la clase Java String, debe utilizar una barra invertida doble para definir una sola barra invertida. Por ejemplo, para definir \w, debe utilizar \w en su expresión regular.

Hay siete grupos de captura en este patrón de expresiones regulares y siete campos en los datos de entrada. Al consultar la tabla, RegexSerDe no lanza la excepción «Number of matching groups doesn't match the number of columns».

Para ejecutar una instrucción de DDL, especifique los grupos de captura de expresiones regulares para SERDEPROPERTIES como se muestra en el siguiente ejemplo:

CREATE EXTERNAL TABLE logs
(
  col1 string,
  col2 string,
  col3 string,
  col4 string,
  col5 string,
  col6 string,
  col7 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
   "input.regex" = "^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$")
LOCATION 's3://doc-example-bucket/path/'

Información relacionada

Using a SerDe

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años