Por que não recebo nenhum registro quando consulto minha tabela do Amazon Athena?

6 minuto de leitura
0

Executei uma instrução CREATE TABLE no Amazon Athena com as colunas esperadas e seus tipos de dados. Quando executo a consulta SELECT * FROM table-name, a saída é "Zero registros retornados."

Resolução

Existem vários motivos comuns pelos quais a consulta pode retornar zero registros. Com base no seu caso de uso, consulte a seção relacionada para ver os motivos comuns e as etapas de solução de problemas.

Partições do AWS Glue

Arquivo selecionado nas configurações do crawler

Se você usa um crawler, confirme se ele aponta para o bucket do Amazon Simple Storage Service (Amazon S3) em vez de para um arquivo.

Caminho LOCATION incorreto

Verifique o caminho LOCATION do Amazon S3 para os dados de entrada. Se o caminho LOCATION de entrada estiver incorreto, o Athena retornará zero registros.

Barra dupla no caminho LOCATION

O Athena não suporta caminhos de localização de tabelas que incluam uma barra dupla (//). Por exemplo, o caminho LOCATION a seguir retorna resultados vazios: s3://doc-example-bucket/myprefix//input//

Para resolver esse problema, copie os arquivos para um local que não tenha barras duplas. Veja a seguir um comando da AWS Command Line Interface (AWS CLI) para copiar arquivos:

aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de usar a versão mais recente da AWS CLI.

**Caracteres especiais **

É uma prática recomendada incluir somente sublinhados ou letras maiúsculas nos nomes das colunas da tabela. Por exemplo, você pode nomear uma coluna como table_name, mas não como table-name. Dados de várias tabelas armazenados nos crawlers do AWS Glue do mesmo prefixo do S3 criam tabelas separadas para dados armazenados no mesmo prefixo do S3. No entanto, quando você consulta essas tabelas no Athena, você obtém zero registros. Por exemplo, sua consulta do Athena retornará zero registros se a localização da tabela for semelhante a estes exemplos:

  • s3://doc-example-bucket/table1.csv
  • s3://doc-example-bucket/table2.csv

Para resolver esse problema, crie prefixos individuais do S3 para cada tabela, semelhantes aos seguintes exemplos:

  • s3://doc-example-bucket/table1/table1.csv
  • s3://doc-example-bucket/table2/table2.csv

Em seguida, execute uma consulta semelhante ao seguinte exemplo para atualizar o local da tabela table1:

ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';

Partições ainda não carregadas

O Athena cria metadados somente quando uma tabela é criada. Os dados são analisados somente quando você executa a consulta. Se sua tabela tiver partições definidas, talvez as partições ainda não tenham sido carregadas no catálogo de dados do AWS Glue ou no catálogo de dados interno do Athena. Use MSCK REPAIR TABLE ou ALTER TABLE ADD PARTITION para carregar as informações da partição no catálogo.

Se as partições estiverem armazenadas em um formato compatível com o Athena, execute MSCK REPAIR TABLE para carregar os metadados de uma partição no catálogo. Por exemplo, se você tiver uma tabela particionada em Ano, o Athena espera encontrar os dados nos caminhos do Amazon S3 semelhantes aos seguintes exemplos:

  • s3://doc-example-bucket/athena/inputdata/year=2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2018/data.csv

Se os dados estiverem localizados nos caminhos do Amazon S3 que o Athena espera, execute um comando semelhante a este exemplo para reparar a tabela:

CREATE EXTERNAL TABLE Employee (
    Id INT,
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://doc-example-bucket/athena/inputdata/';

Depois que a tabela for criada, carregue as informações da partição:

MSCK REPAIR TABLE Employee;

Depois que os dados forem carregados, execute a seguinte consulta novamente:

SELECT * FROM Employee;

Se as partições não estiverem armazenadas em um formato compatível com o Athena ou estiverem localizadas em caminhos diferentes do Amazon S3, execute ALTER TABLE ADD PARTITION para cada partição.

Por exemplo, suponha que seus dados estejam localizados nos seguintes caminhos de exemplo do Amazon S3:

  • s3://doc-example-bucket/athena/inputdata/2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/2018/data.csv

Com esses caminhos, execute um comando semelhante a este exemplo:

ALTER TABLE Employee ADD
    PARTITION (year=2020) LOCATION 's3://doc-example-bucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://doc-example-bucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://doc-example-bucket/athena/inputdata/2018/'

Depois que os dados forem carregados, execute a seguinte consulta novamente:

SELECT * FROM Employee;

Arquivos ocultos do Hive

Verifique se os nomes dos arquivos não começam com um sublinhado (_) ou um ponto (.).

O Athena considera esses arquivos como espaços reservados e os ignora quando você processa uma consulta. Para obter mais informações, consulte O Athena não pode ler arquivos ocultos. Se todos os arquivos no caminho do S3 tiverem nomes que comecem com um sublinhado ou um ponto, você obterá zero registros.

Observação: se o caminho do S3 incluir espaços reservados junto com arquivos cujos nomes começam com caracteres diferentes, o Athena ignora somente os espaços reservados e consulta os outros arquivos. Portanto, você pode obter um ou mais registros.

Por exemplo:

  • s3://doc-example-bucket/athena/inputdata/_file1
  • s3://doc-example-bucket/athena/inputdata/.file2

Projeção de partição

Valores que não estão dentro dos limites da faixa para projeção de partições

As consultas de valores que estão além dos limites definidos para a projeção de partição não retornam um erro. Em vez disso, a consulta retorna zero linhas.

Por exemplo, suponha que seus dados comecem em 2020 e sejam definidos como: projection.timestamp.range'='2020/01/01,NOW

Se você executar esse exemplo de consulta, a consulta será concluída com êxito, mas retornará zero linhas:

SELECT * FROM table-name WHERE timestamp = '2019/02/02'

O modelo de armazenamento não segue o esquema de particionamento padrão

Se os locais dos arquivos do Amazon S3 não seguirem o padrão de localização ".../column=value...", você precisará especificar um esquema de particionamento personalizado do Amazon S3. Se você não definir um esquema personalizado, sua consulta retornará zero registros.

Para definir um esquema de particionamento do S3 personalizado, consulte Especificar locais de armazenamento personalizados do S3.

Modelo de armazenamento personalizado incorreto

Se você usar um modelo personalizado, certifique-se de que o modelo permita que o Athena crie seus locais de partição. Além disso, certifique-se de que cada espaço reservado e o caminho do Amazon S3 terminem com uma única barra.

Por exemplo, suponha que você defina um ano da coluna de partição com a instrução DDL PARTITIONED BY (string de ano) e os locais dos seus arquivos do S3 sejam s3://doc-example-bucket/athena/inputdata/Year=2022/. Esse local retorna zero registros. Atualize o local de armazenamento do Amazon S3 para: s3://doc-example-bucket/athena/inputdata/Year=${year}.

Propriedades da partição

Se você tiver colunas de partição de tipo enum, inteiro ou data, certifique-se de definir as propriedades da partição corretamente. As configurações devem permitir que o Athena crie locais de partição que correspondam à estrutura dos seus dados no Amazon S3.

Por exemplo, suponha que você tenha dados relacionados ao tempo que chegam diariamente uma hora depois da meia-noite no local: s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00.

Neste exemplo, a tabela do Athena usa estas propriedades de partição:

'projection.dt.format' = 'yyyy-MM-dd-HH-mm',
'projection.dt.range' = '2022-01-01-00-00,NOW',
'projection.dt.interval' = '1',
'projection.dt.interval.unit' = 'DAYS'

As consultas executadas na tabela de exemplo retornam zero registros. Isso ocorre porque os locais dos arquivos da propriedade projetados correspondem à meia-noite s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00.

Para resolver esse problema, defina a propriedade 'projection.dt.range' como '2022-01-01-01-00,NOW'.

Informações relacionadas

Criar tabelas no Athena

Usar crawlers do AWS Glue

Configurar a projeção de partições

AWS OFICIAL
AWS OFICIALAtualizada há 10 meses