Comment résoudre l'erreur RegexSerDe "Le nombre de groupes correspondants ne correspond pas au nombre de colonnes" dans Amazon Athena ?

Dernière mise à jour : 24/09/2020

J'ai créé une table Amazon Athena en utilisant RegexSerDe. Lorsque j'interroge la table, j'obtiens cette erreur : "Le nombre de groupes correspondants ne correspond pas au nombre de colonnes."

Solution

Pour résoudre cette erreur, assurez-vous que le nombre de groupes de capture dans le modèle regex correspond au nombre de champs définis lors de la création de la table dans Athena. Par exemple, voici une ligne de données d'entrée :

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 ligne comporte sept champs. C'est le motif regex correct :

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

Remarque : RegexSerDe suit la norme Java. Étant donné que la barre oblique inverse est un caractère d'échappement dans la classe Java String, vous devez utiliser une double barre oblique inverse pour définir une seule barre oblique inverse. Par exemple, pour définir \w, vous devez utiliser \\w dans votre regex.

Il y a sept groupes de capture dans ce modèle regex, et il y a sept champs dans les données en entrée. Lorsque vous interrogez la table, RegexSerDe ne lance pas l'exception "Nombre de groupes correspondants ne correspond pas au nombre de colonnes".

Pour exécuter une instruction DDL, spécifiez les groupes de capture regex pour SERDEPROPERTIES, comme indiqué dans l'exemple suivant :

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

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?