Wie behebe ich den RegexSerDe-Fehler „Die Anzahl der passenden Gruppen entspricht nicht der Anzahl der Spalten“ in Amazon Athena?

Lesedauer: 2 Minute
0

Ich habe mit RegexSerDe eine Amazon Athena-Tabelle erstellt. Wenn ich die Tabelle abfrage, erhalte ich folgende Fehlermeldung: „Die Anzahl der passenden Gruppen entspricht nicht der Anzahl der Spalten.“

Lösung

Um diesen Fehler zu beheben, stellen Sie sicher, dass die Anzahl der Erfassungsgruppen im Regex-Muster der Anzahl der Felder entspricht, die bei der Erstellung der Tabelle in Athena definiert wurden. Hier ist zum Beispiel eine Zeile mit Eingabedaten:

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

Die Zeile hat sieben Felder. Dies ist das richtige Regex-Muster:

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

Hinweis: RegexSerFe folgt dem Java-Standard. Da der Backslash ein Escape-Zeichen in der Java-String-Klasse ist, müssen Sie einen doppelten Backslash verwenden, um einen einzelnen Backslash zu definieren. Um beispielsweise \w zu definieren, müssen Sie \w in Ihrem Regex verwenden.

In diesem Regex-Muster gibt es sieben Erfassungsgruppen, und die Eingabedaten enthalten sieben Felder. Wenn Sie die Tabelle abfragen, löst RegexSerDE nicht die Ausnahme „Anzahl der übereinstimmenden Gruppen entspricht nicht der Anzahl der Spalten“ aus.

Um eine DDL-Anweisung auszuführen, geben Sie die Regex-Erfassungsgruppen für SERDEPROPERTIES an, wie im folgenden Beispiel gezeigt:

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

Verwandte Informationen

Verwenden eines SerDe

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren