Come posso risolvere l'errore RegexSerDe "Il numero di gruppi corrispondenti non corrisponde al numero di colonne" in Amazon Athena?

2 minuti di lettura
0

Ho creato una tabella Amazon Athena utilizzando RegexSerDe. Quando interrogo la tabella, ricevo il seguente errore: "Il numero di gruppi corrispondenti non corrisponde al numero di colonne".

Soluzione

Per risolvere questo errore, assicurati che il numero di gruppi di acquisizione nel modello regex corrisponda al numero di campi definiti quando hai creato la tabella in Athena. Ecco, ad esempio, una riga di dati di input:

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 riga ha sette campi. Questo è il modello regex corretto:

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

**Nota:**RegexSerDe segue lo standard Java. Poiché la barra rovesciata è un carattere di escape della classe Java String, è necessario utilizzare una barra rovesciata doppia per definire una singola barra rovesciata. Ad esempio, per definire \w, devi usare \w nella tua regex.

Ci sono sette gruppi di acquisizione in questo modello di regex e ci sono sette campi nei dati di input. Quando si interroga la tabella, RegExSerDe non viene generata l'eccezione "Il numero di gruppi corrispondenti non corrisponde al numero di colonne".

Per eseguire un'istruzione DDL, specifica i gruppi di acquisizione regex per SERDEPROPERTIES, come mostrato nell'esempio seguente:

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

Informazioni correlate

Come usare una SerDe

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa