Como resolver o erro "GENERIC_INTERNAL_ERROR" ao consultar uma tabela no Amazon Athena?

8 minuto de leitura
0

Quando consulto minha tabela do Amazon Athena, recebo o erro "GENERIC_INTERNAL_ERROR".

Breve descrição

Os diferentes tipos de exceções GENERIC_INTERNAL_ERROR e suas causas são as seguintes:

  • GENERIC_INTERNAL_ERROR: null: Você pode ver essa exceção em qualquer uma das seguintes condições:
  • Você tem uma incompatibilidade de esquema entre o tipo de dados de uma coluna na definição da tabela e o tipo de dados real do conjunto de dados.
  • Você está executando uma consulta CREATE TABLE AS SELECT (CTAS) com sintaxe imprecisa.
  • **GENERIC_INTERNAL_ERROR: o construtor pai é nulo:**Você pode ver essa exceção ao consultar uma tabela com colunas de do tipo de dados array e o formato SerDe OpenCSVSerDe. O formato OpenCSVSerDe não oferece suporte ao tipo de dados array.
  • GENERIC_INTERNAL_ERROR: O valor excede MAX_INT: você pode ver essa exceção quando a coluna de dados de origem é definida com o tipo de dados INT e tem um valor numérico maior que 2.147.483.647.
  • GENERIC_INTERNAL_ERROR: O valor excede MAX_BYTE: você pode ver essa exceção quando a coluna de dados de origem tem um valor numérico que excede o tamanho permitido para o tipo de dados BYTE. O tipo de dados BYTE é equivalente a TINYINT. TINYINT é um INTEGER com sinal de 8 bits no formato de complemento de dois com um valor mínimo de -128 e um valor máximo de 127.
  • GENERIC_INTERNAL_ERROR: O número de valores da partição não corresponde ao número de filtros: você poderá ver essa exceção se tiver partições inconsistentes nos dados do Amazon Simple Storage Service (Amazon S3). Você pode ter partições inconsistentes sob qualquer uma das seguintes condições:
  • As partições no Amazon S3 foram alteradas (exemplo: novas partições adicionadas).
  • O número de colunas de partição na tabela não corresponde ao dos metadados da partição.
  • GENERIC_INTERNAL_ERROR: Várias entradas com a mesma chave: você pode ver essa exceção devido às chaves (colunas) nos dados JSON quando:
  • O mesmo nome é usado duas vezes.
  • O mesmo nome é usado quando é convertido em minúsculas.

Resolução

GENERIC_INTERNAL_ERROR:null

Incompatibilidade de tipos de dados de coluna: certifique-se de que o tipo de dados de coluna na definição da tabela seja compatível com o tipo de dados de coluna nos dados de origem. O Athena usa a tecnologia de esquema na leitura. Isso significa que suas definições de tabela são aplicadas aos seus dados no Amazon S3 quando as consultas são processadas.

Por exemplo, quando uma tabela é criada em arquivos Parquet:

  • O Athena lê o esquema dos arquivos
  • Em seguida, o Athena valida o esquema em relação à definição da tabela em que o arquivo Parquet é consultado.

Se o tipo de dados subjacente de uma coluna não corresponder ao tipo de dados mencionado durante a definição da tabela, o erro de incompatibilidade de tipos de dados de coluna será exibido.

Para resolver esse problema, verifique se os arquivos de dados de origem não estão corrompidos. Se houver uma incompatibilidade de esquema entre os arquivos de dados de origem e a definição da tabela, faça o seguinte:

  • Atualize o esquema usando o Catálogo de Dados do AWS Glue.
  • Crie uma nova tabela usando a definição de tabela atualizada.

Se os arquivos de dados de origem estiverem corrompidos, exclua-os e consulte a tabela.

Sintaxe imprecisa: você pode receber o erro "GENERIC INTERNAL ERROR:null" quando as duas condições a seguir forem verdadeiras:

Para evitar esse erro, você deve usar nomes de coluna diferentes para as propriedades partitioned_by e bucketed_by ao usar a consulta CTAS. Para resolver esse erro, crie uma nova tabela escolhendo nomes de coluna diferentes para as propriedades partitioned_by e bucketed_by.

GENERIC_INTERNAL_ERROR: o construtor pai é nulo

Para resolver esse erro, localize a coluna com o tipo de dados array e, em seguida, altere o tipo de dados dessa coluna para string. Para alterar o tipo de dados da coluna para string, faça o seguinte:

  • Atualize o esquema no Catálogo de Dados.
  • Crie uma nova tabela escolhendo o tipo de dados da coluna como string.

Execute o comando SHOW CREATE TABLE para gerar a consulta que criou a tabela. Em seguida, visualize o tipo de dados da coluna para todas as colunas na saída desse comando. Localize a coluna com o tipo de dados array e, em seguida, altere o tipo de dados dessa coluna para string.

Para atualizar o esquema da tabela com o Catálogo de Dados, faça o seguinte:

  1. Abra o console do AWS Glue.
  2. No painel de navegação, escolha Tabelas.
  3. Selecione a tabela que você deseja atualizar.
  4. Escolha Ações e depois Exibir detalhes.
  5. Escolha Editar esquema.
  6. Role até a coluna com o tipo de dados array e escolha array.
  7. Em Tipo de coluna, selecione string na lista suspensa.
  8. Escolha Atualizar.
  9. Na página Editar esquema, escolha Salvar.

GENERIC_INTERNAL_ERROR: O valor excede MAX_INT

Para resolver esse erro, localize a coluna com o tipo de dados int e depois atualize o tipo de dados dessa coluna de int para bigint. Para alterar o tipo de dados da coluna, atualize o esquema no Catálogo de Dados ou crie uma nova tabela com o esquema atualizado.

Execute o comando SHOW CREATE TABLE para gerar a consulta que criou a tabela. Em seguida, visualize o tipo de dados da coluna para todas as colunas na saída desse comando. Localize a coluna com o tipo de dados int e, em seguida, altere o tipo de dados dessa coluna para bigint.

Para atualizar o esquema da tabela com o Catálogo de Dados, faça o seguinte:

  1. Abra o console do AWS Glue.
  2. No painel de navegação, escolha Tabelas.
  3. Selecione a tabela que você deseja atualizar.
  4. Escolha Ações e depois Exibir detalhes.
  5. Escolha Editar esquema.
  6. Role até a coluna com o tipo de dados int e escolha int.
  7. Em Tipo de coluna, selecione bigint na lista suspensa.
  8. Escolha Atualizar.
  9. Na página Editar esquema, escolha Salvar.

GENERIC_INTERNAL_ERROR: O valor excede MAX_BYTE

Para resolver esse erro, localize a coluna com o tipo de dados tinyint. Em seguida, altere o tipo de dados dessa coluna para smallint, int ou bigint. Ou você pode resolver esse erro criando uma nova tabela com o esquema atualizado.

Execute o comando SHOW CREATE TABLE para gerar a consulta que criou a tabela. Em seguida, visualize o tipo de dados da coluna para todas as colunas na saída desse comando. Localize a coluna com o tipo de dados tinyint e altere o tipo de dados dessa coluna para smallint, bigint ou int.

Para atualizar o esquema da tabela com o Catálogo de Dados, faça o seguinte:

  1. Abra o console do AWS Glue.
  2. No painel de navegação, selecione Tabelas.
  3. Selecione a tabela que você deseja atualizar.
  4. Escolha Ações e depois Exibir detalhes.
  5. Escolha Editar esquema.
  6. Role até a coluna com o tipo de dados tinyint e escolha tinyinit.
  7. Em Tipo de coluna, selecione smallint, bigint ou int na lista suspensa.
  8. Escolha Atualizar.
  9. Na página Editar esquema, escolha Salvar.

GENERIC_INTERNAL_ERROR: O número de valores da partição não corresponde ao número de filtros

Para resolver esse erro, faça o seguinte:

ALTER TABLE doc_example_table DROP PARTITION (date = '2014-05-14');

ALTER TABLE doc_example_table ADD PARTITION (date = '2016-05-14', country = 'IN');

GENERIC_INTERNAL_ERROR: Várias entradas com a mesma chave

Se as linhas tiverem várias colunas com a mesma chave, é necessário pré-processar os dados para incluir um par de chave/valor válido. Se apenas alguns dos logs tiverem chaves duplicadas e você quiser ignorar esses logs, defina ignore.malformed.json como SERDEPROPERTIES em org.openx.data.jsonserde.JsonSerDe.

Se os nomes das chaves forem iguais, mas em casos diferentes (por exemplo: "Coluna", "coluna"), você deve usar o mapeamento. Isso ocorre porque o hive não oferece suporte a colunas com distinção entre maiúsculas e minúsculas. Para fazer isso, você deve configurar o SerDe para ignorar o uso de maiúsculas e minúsculas.

Faça o seguinte:

CREATE TABLE mytable (  
  time1 string,
  time2 string)
 ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
"case.insensitive" = "false", --tells hive to ignore key case
"mapping.time1"= "time", -- lowercase 'time' mapped into 'time1'
"mapping.time2"= "Time") -- uppercase to 'time2'

Informações relacionadas

Tipos de dados no Amazon Athena

Particionar dados no Athena

AWS OFICIAL
AWS OFICIALAtualizada há um ano