Ao usar o AWS re:Post, você concorda com os AWS re:Post Termos de uso

Por que minha consulta do Athena falha com o erro “HIVE_INVALID_METADATA: Os metadados do Hive para a tabela são inválidos: O descritor de tabela contém colunas duplicadas”?

4 minuto de leitura
0

Minha consulta do Amazon Athena falha com o erro “HIVE_INVALID_METADATA: Os metadados do Hive para a tabela sample_table são inválidos: O descritor de tabela contém colunas duplicadas”.

Breve descrição

Esse erro ocorre quando o esquema de tabela do AWS Glue contém nomes de coluna duplicados ou colunas com o mesmo nome das colunas de partição.

Resolução

Verifique se há nomes de colunas duplicados

Para identificar a coluna duplicada, execute SHOW CREATE TABLE para recuperar o esquema da tabela. Ou veja o esquema da tabela no console do AWS Glue. No exemplo a seguir, há duas colunas denominadas “coluna1”.

CREATE EXTERNAL TABLE `athenatestingduplicatecolumn_athenatesting`(  `column1` bigint,
  `column2` bigint,
  `column3` bigint,
  `column1` bigint)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc-example-bucket/athenatesting/'
TBLPROPERTIES (
  'classification'='csv',
  'skip.header.line.count'='1'
  )

Para resolver o erro, execute CREATE TABLE para recriar a tabela Athena com nomes de coluna exclusivos. Ou use o console do AWS Glue para renomear as colunas duplicadas:

  1. Abra o console do AWS Glue.
  2. Escolha o nome da tabela na lista e escolha Editar esquema.
  3. Escolha o nome da coluna, insira um novo nome e escolha Salvar.

Verifique se há colunas de tabela e colunas de partição que tenham o mesmo nome

Para verificar se há nomes duplicados de colunas de partição e colunas de tabela, visualize o esquema da tabela no console do AWS Glue. No exemplo a seguir, a coluna da partição e a coluna da tabela são denominadas “id”.

Dados de exemplo:

{ "id" : 50, "name":"John" }{ "id" : 51, "name":"Jane" }
{ "id" : 53, "name":"Jill" }

Definição da tabela:

Nome da colunaTipo de dadosChave de partição
idint
namestring
idstringPartition (0)

Use uma das seguintes opções para resolver o problema:

  • Renomeie a coluna de partição no caminho do Amazon Simple Storage Service (Amazon S3).
  • Renomeie o nome da coluna nos dados e na definição da tabela do AWS Glue.
  • Se os dados de origem forem JSON, use a função de mapeamento em vez do crawler do AWS Glue para recriar manualmente a tabela. Em seguida, adicione partições no Athena. No exemplo a seguir, a tabela do AWS Glue aponta para s3://doc-example-bucket/athenajsontesting/, que tem essa estrutura de partição: s3://doc-example-bucket/athenajsontesting/id=12. Depois de criar a tabela, use MSCK REPAIR TABLE para carregar a partição.
CREATE EXTERNAL TABLE `athenajsontest_athenajsontesting2`(  `id1` int COMMENT 'from deserializer',
  `name` string COMMENT 'from deserializer')
PARTITIONED BY (
  `id` string)
ROW FORMAT SERDE
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'mapping.id1'='id')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://doc-example-bucket/athenajsontesting'
TBLPROPERTIES (
  'classification'='json',
  'transient_lastDdlTime'='1578399113')

Verifique se há chaves duplicadas nos dados de origem JSON

Se os dados de origem JSON contiverem nomes de colunas que diferem somente em maiúsculas e minúsculas (por exemplo, {"Username”: “bob1234", “username”: “bob”}), consulte Por que recebo erros quando tento ler dados JSON no Amazon Athena? Por padrão, o Athena não diferencia maiúsculas de minúsculas. O Athena trata “Username” e “username” como chaves duplicadas, a menos que você use o OpenX SerDe e defina a propriedade case.insensitive como false.

Verifique se há chaves duplicadas nos dados de origem do Parquet

Se a fonte de dados estiver no formato Parquet e a tabela tiver uma coluna duplicada, altere um dos nomes das colunas. Defina a propriedade serDe parquet.column.index.access como true. O Parquet acessa colunas por nome e ORC por índice.

Para obter mais informações, consulte Tratamento de atualizações do esquema.

Informações relacionadas

Bibliotecas JSON SerDe

AWS OFICIAL
AWS OFICIALAtualizada há 10 meses