J'ai créé une table Amazon Athena à l'aide de RegexSerDe. Lorsque je requête la table, je reçois l'erreur suivante : « Number of matching groups doesn't match the number of columns » (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 du schéma regex correspond au nombre de champs qui ont été définis lors de la création de la table dans Athena. Voici un exemple de ligne de données en 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 a 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/'
Informations connexes
Utilisation d'un SerDe