Database

SAS e Impala: Cómo forzar la resolución de esquema por nombre en el Pass-Through SQL

Simon 26/11/2024 1 vistas

Al consultar tablas de Impala almacenadas como archivos Parquet a través de SAS©, puede surgir un problema insidioso: los datos se muestran en el orden incorrecto o las columnas contienen valores erróneos.

Este fenómeno a menudo se debe a la forma en que Impala lee los metadatos de los archivos Parquet. Por defecto, si la estructura del archivo físico difiere ligeramente de la definición de la tabla (por ejemplo, un orden de columnas diferente), Impala puede intentar hacer coincidir las columnas por su posición (índice) en lugar de por su nombre.

Para corregir esto directamente en Impala, se utiliza la opción PARQUET_FALLBACK_SCHEMA_RESOLUTION=name. Pero, ¿cómo aplicar esta configuración específica al usar el SQL Pass-Through en SAS©?

Illustration

El problema: La inadecuación del esquema

Cuando intentas extraer una tabla a través de SAS© sin esta opción, puedes encontrar que los valores no corresponden a las columnas correctas. Esto sucede porque Impala recurre al orden de las columnas.

Un intento común es tratar de integrar esta opción directamente en la cadena de conexión (connect to impala (&impala.)) o ejecutar el comando SET en el lugar incorrecto (por ejemplo, al crear una vista intermedia), lo que a menudo no produce ningún efecto.

La solución: La ejecución secuencial

La clave para resolver este problema es entender que la sesión Pass-Through debe recibir la instrucción de configuración antes de ejecutar la consulta de selección de datos, pero dentro del mismo bloque de conexión.

Es necesario usar la instrucción EXECUTE BY IMPALA para enviar el comando SET a la base de datos justo antes de lanzar el SELECT.

El procedimiento paso a paso

  1. Abrir la conexión a Impala.

  2. Ejecutar la opción de configuración para forzar la resolución por nombre.

  3. Recuperar los datos a través de la conexión establecida.

Ejemplo de código corregido

Aquí está la sintaxis SAS© PROC SQL funcional para este caso de uso:

1PROC SQL;
2 /* 1. Établir la connexion */
3 connect to impala (&impala.);
4 
5 /* 2. Définir l'option de résolution de schéma */
6 execute BY impala (SET PARQUET_FALLBACK_SCHEMA_RESOLUTION=name);
7 
8 /* 3. Exécuter la requête de récupération des données */
9 create TABLE SASDATASET as
10 select * from connection to impala
11 (SELECT * FROM db_name.tablename);
12 
13 /* Fermeture propre */
14 disconnect from impala;
15QUIT;

¿Por qué funciona esto? Al separar la instrucción SET, se modifica el entorno de la sesión activa de Impala. Cuando la siguiente consulta (SELECT *) se envía a través de connection to impala, se beneficia de esta configuración y mapea correctamente las columnas del archivo Parquet por su nombre, garantizando la integridad de los datos recuperados en SAS©.