Como resolvo o erro “O número de grupos correspondentes não corresponde ao número de colunas” do RegexSerDe no Amazon Athena?

2 minuto de leitura
0

Criei uma tabela do Amazon Athena usando o RegexSerDe. Quando consulto a tabela, recebo este erro: “O número de grupos correspondentes não corresponde ao número de colunas.”

Resolução

Para resolver esse erro, certifique-se de que o número de grupos de captura no padrão de regex corresponda ao número de campos definidos quando você criou a tabela no Athena. Por exemplo, aqui está uma linha de dados 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

A linha tem sete campos. Esse é o padrão de regex correto:

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

Observação: o RegexSerDe segue o padrão Java. Como a barra invertida é um caractere de escape na classe String do Java, você deve usar uma barra invertida dupla para definir uma única barra invertida. Por exemplo, para definir \w, você deve usar \w em seu regex.

Há sete grupos de captura nesse padrão de regex e sete campos nos dados de entrada. Quando você consulta a tabela, o RegexSerDe não lança a exceção “O número de grupos correspondentes não corresponde ao número de colunas”.

Para executar uma instrução DDL, especifique os grupos de captura de regex para SERDEPROPERTIES, como mostra o seguinte exemplo:

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

Informações relacionadas

Usar um SerDe

AWS OFICIAL
AWS OFICIALAtualizada há 2 anos