¿Por qué no recibo ningún registro cuando consulto mi tabla de Amazon Athena?

7 minutos de lectura
0

He ejecutado una instrucción CREATE TABLE en Amazon Athena con las columnas esperadas y sus tipos de datos. Cuando ejecuto la consulta SELECT * FROM table-name, el resultado es "No se han devuelto registros".

Resolución

Estos son algunos de los motivos habituales por los que la consulta puede no devolver ningún registro. Según su caso de uso, consulte la sección relacionada para conocer los motivos comunes y los pasos de solución de problemas.

Particiones de AWS Glue

Archivo seleccionado en la configuración del rastreador

Si utiliza un rastreador, confirme que el rastreador apunte al bucket de Amazon Simple Storage Service (Amazon S3) y no a un archivo.

Ruta de UBICACIÓN incorrecta

Compruebe la ruta de UBICACIÓN de Amazon S3 para los datos de entrada. Si la ruta de UBICACIÓN de entrada es incorrecta, Athena no devuelve ningún registro.

Barra doble en la ruta de UBICACIÓN

Athena no admite rutas de ubicación de tablas que incluyan una barra doble (//). Por ejemplo, la siguiente ruta de UBICACIÓN devuelve resultados vacíos: s3://doc-example-bucket/myprefix//input//

Para resolver este problema, copie los archivos a una ubicación que no tenga barras dobles. A continuación, se muestra un comando de la Interfaz de la línea de comandos de AWS (AWS CLI) para copiar archivos:

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

Nota: Si aparecen errores al ejecutar los comandos de AWS CLI, asegúrese de utilizar la versión más reciente de AWS CLI.

Caracteres especiales

Se recomienda incluir solo guiones bajos o mayúsculas en los nombres de las columnas de la tabla. Por ejemplo, puede asignar a una columna el nombre tabla_nombre, pero no tabla-nombre. Datos de varias tablas almacenadas en el mismo prefijo de S3 Los rastreadores de AWS Glue crean tablas independientes para los datos que se almacenan en el mismo prefijo de S3. Sin embargo, cuando consulta esas tablas en Athena, no obtiene ningún registro. Por ejemplo, la consulta de Athena no devuelve ningún registro si la ubicación de la tabla es similar a las siguientes:

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

Para resolver este problema, cree prefijos de S3 individuales para cada tabla de forma similar a la siguiente:

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

A continuación, ejecute una consulta similar a la siguiente para actualizar la ubicación de la tabla table1:

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

Las particiones aún no se han cargado

Athena crea metadatos solo cuando se crea una tabla. Los datos se analizan únicamente cuando se ejecuta la consulta. Si la tabla tiene particiones definidas, es posible que las particiones aún no estén cargadas en el Catálogo de datos de AWS Glue ni en el catálogo de datos interno de Athena. Utilice MSCK REPAIR TABLE o ALTER TABLE ADD PARTITION para cargar la información de las particiones en el catálogo.

Si las particiones se almacenan en un formato compatible con Athena, ejecute MSCK REPAIR TABLE para cargar los metadatos de una partición en el catálogo. Por ejemplo, si tiene una tabla que está particionada por Year, Athena espera encontrar los datos en rutas de Amazon S3 similares a las siguientes:

  • 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

Si los datos se encuentran en las rutas de Amazon S3 que Athena espera, ejecute un comando similar al de este ejemplo para reparar la tabla:

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

Después de crear la tabla, cargue la información de la partición:

MSCK REPAIR TABLE Employee;

Una vez cargados los datos, vuelva a ejecutar la siguiente consulta:

SELECT * FROM Employee;

Si las particiones no están almacenadas en un formato compatible con Athena o están ubicadas en diferentes rutas de Amazon S3, ejecute ALTER TABLE ADD PARTITION para cada partición.

Por ejemplo, supongamos que los datos se encuentran en las siguientes rutas de 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

Con estas rutas, ejecute un comando similar al siguiente:

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

Una vez cargados los datos, vuelva a ejecutar la siguiente consulta:

SELECT * FROM Employee;

Archivos ocultos de Hive

Compruebe que los nombres de los archivos no comiencen por un guion bajo (_) ni por un punto (.).

Athena considera estos archivos como marcadores de posición y los ignora cuando se procesa una consulta. Para obtener más información, consulte Athena no puede leer archivos ocultos. Si todos los archivos de la ruta de S3 tienen nombres que comienzan por un guion bajo o un punto, no obtendrá ningún registro.

Nota: Si la ruta de S3 incluye marcadores de posición junto con archivos cuyos nombres comienzan con caracteres diferentes, Athena solo ignora los marcadores de posición y consulta los demás archivos. Por lo tanto, es posible que obtenga uno o más registros.

Por ejemplo:

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

Proyección de particiones

Valores que no están dentro de los límites del rango para la proyección de particiones

Las consultas de valores que superan los límites del rango definidos para la proyección de particiones no devuelven ningún error. En su lugar, la consulta no devuelve ninguna fila.

Por ejemplo, supongamos que los datos comienzan en 2020 y se definen como: projection.timestamp.range'='2020/01/01,NOW

Si ejecuta esta consulta de ejemplo, esta se completa correctamente, pero no devuelve ninguna fila:

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

La plantilla de almacenamiento no sigue el esquema de particionamiento predeterminado

Si las ubicaciones de los archivos de Amazon S3 no siguen el patrón de ubicación "…/column=value…", debe especificar un esquema de particionamiento de Amazon S3 personalizado. Si no define un esquema personalizado, la consulta no devolverá ningún registro.

Para definir un esquema de particionamiento de S3 personalizado, consulte Especificar ubicaciones de almacenamiento de S3 personalizadas.

Plantilla de almacenamiento personalizada incorrecta

Si utiliza una plantilla personalizada, asegúrese de que la plantilla permita a Athena crear las ubicaciones de las particiones. Además, asegúrese de que cada marcador de posición y la ruta de Amazon S3 terminen con una sola barra diagonal.

Por ejemplo, supongamos que define una columna de particiones year con la instrucción de DDL PARTITIONED BY (cadena de año) y las ubicación de los archivos de S3 es s3://doc-example-bucket/athena/inputdata/Year=2022/. Esta ubicación no devuelve ningún registro. Actualice la ubicación de almacenamiento de Amazon S3 a: s3://doc-example-bucket/athena/inputdata/Year=${year}.

Propiedades de partición

Si tiene un tipo de enumeración, entero o fecha de columnas de partición, asegúrese de configurar las propiedades de la partición correctamente. Las configuraciones deben permitir que Athena cree ubicaciones de partición que coincidan con la estructura de los datos en Amazon S3.

Por ejemplo, supongamos que tiene datos relacionados con el tiempo que llegan a diario una hora después de medianoche en la ubicación: s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00.

En este ejemplo, la tabla de Athena utiliza estas propiedades de partición:

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

Las consultas que se ejecutan en la tabla de ejemplo no devuelven ningún registro. Esto se debe a que las ubicaciones proyectadas de los archivos de la propiedad corresponden a la medianoche s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00.

Para resolver este problema, defina la propiedad 'projection.dt.range' en '2022-01-01-01-00,NOW'.

Información relacionada

Creación de tablas en Athena

Uso de rastreadores de AWS Glue

Configuración de la proyección de particiones

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 8 meses