Fedsql

Tutorial Avanzado: Manipular JSON nativo en SAS Viya con FedSQL

Simon 13 views

En el entorno SAS© Viya, el lenguaje FedSQL es el estándar para interactuar con los datos. Si bien es excelente para traducir consultas estándar (SQL ANSI) a bases de datos (Pass-Through Implícito), muestra sus límites cuando se desea utilizar funcionalidades propietarias del motor de base de datos, como funciones geoespaciales o el análisis de JSON.

Este artículo se centra en una técnica potente: el Pass-Through Explícito, ilustrado aquí con la extracción de datos JSON almacenados en PostgreSQL.

El Desafío: Los límites de la traducción automática

Cuando escribe una consulta FedSQL clásica, SAS© intenta traducirla a SQL nativo para enviarla a la base de datos. Sin embargo, si su consulta contiene operadores que SAS© no conoce, la traducción falla o SAS© intenta recuperar todos los datos para procesarlos localmente.

Tomemos el caso de PostgreSQL, que posee excelentes capacidades de procesamiento JSON a través de operadores específicos como -> o ->>. Si utiliza estos símbolos directamente en una consulta FedSQL estándar, obtendrá un error de sintaxis, porque el intérprete SAS© no los reconoce.

La Solución: El Pass-Through Explícito

La solución consiste en utilizar la cláusula CONNECTION TO. Esta sintaxis crea un "túnel" directo a la base de datos.

El principio es simple: Todo lo que se escribe dentro de la cláusula de conexión es invisible para el intérprete SAS©/FedSQL. SAS© se limita a tomar la cadena de caracteres y pasarla tal cual al motor PostgreSQL.

Sintaxis General

1PROC FEDSQL sessref=ma_session;
2 create TABLE cas.ma_table_cible as
3 select * from CONNECTION TO nom_de_la_caslib
4 (
5 /* Code SQL Natif (Postgres, Oracle, etc.) */
6 /* Invisible pour SAS */
7 );
8QUIT;

Caso Concreto: Análisis de datos JSON

Imaginemos una tabla PostgreSQL que contiene una columna data_json que almacena información en bruto. Queremos extraer un campo específico de este JSON y calcular una agregación, sin cargar nunca el JSON en bruto en CAS (lo que sería pesado e inútil).

El Código

1PROC FEDSQL sessref=mysession;
2 create TABLE cas.synthese_ventes as
3 select region, total_ventes
4 from connection to ma_lib_postgres
5 (
6 /* Début du code natif PostgreSQL */
7 SELECT
8 /* Extraction de la clé 'region' dans l'objet JSON */
9 data_json ->> 'region' as region,
10 /* Extraction et conversion de la clé 'montant' */
11 SUM(CAST(data_json ->> 'montant' as INTEGER)) as total_ventes
12 FROM
13 ventes_brutes_json
14 GROUP BY
15 data_json ->> 'region'
16 /* Fin du code natif PostgreSQL */
17 );
18QUIT;

Análisis Técnico

He aquí por qué este enfoque es óptimo:

  1. La Invisibilidad para el intérprete (Black Box): El intérprete FedSQL no "ve" los operadores -> y ->>. Por lo tanto, no intenta validarlos. Si los viera, devolvería un error de sintaxis ya que estos símbolos no existen en el estándar SQL ANSI compatible con SAS©. Es PostgreSQL quien recibe la cadena en bruto y la interpreta.

  2. Uso de los Operadores Nativos:

    • ->: Recupera un campo de objeto JSON como objeto JSON.

    • ->>: Recupera un campo de objeto JSON como texto (String). Estos operadores permiten navegar por la estructura jerárquica de los datos directamente en el motor de almacenamiento.

  3. Rendimiento y "Movimiento de Datos": Este es el punto crucial.

    • Sin Pass-Through Explícito: Habría que cargar toda la tabla (con el JSON pesado) en CAS, y luego intentar analizar el texto con funciones SAS© complejas. Esto consume una enorme cantidad de memoria y de red.

    • Con Pass-Through Explícito: PostgreSQL realiza la extracción JSON y la agregación ("pesada"). El servidor CAS solo recibe el resultado final: una pequeña tabla de síntesis ("pequeña tabla lista para usar").

El Pass-Through Explícito a través de CONNECTION TO es indispensable para los usuarios avanzados de SAS© Viya. Permite romper las barreras del lenguaje FedSQL estándar para explotar el 100% de las capacidades de sus bases de datos (análisis JSON, XML, indexación específica), al tiempo que minimiza drásticamente los movimientos de datos al servidor CAS.