Hoy en día, gran parte de los datos que llegan a las plataformas analíticas no están completamente estructurados. APIs, logs, eventos y aplicaciones modernas suelen generar datos en formato JSON.
Aunque Snowflake soporta datos semiestructurados mediante el tipo VARIANT, trabajar con estructuras anidadas puede resultar complejo si queremos analizarlas de forma tabular.
Aquí es donde la función FLATTEN se vuelve esencial.
El reto de los datos JSON anidados
Un documento JSON puede tener estructuras como:
{
«order_id»: 1001,
«customer»: «John»,
«items»: [
{«product»: «Laptop», «price»: 1200},
{«product»: «Mouse», «price»: 50}
]
}
Si almacenamos este JSON en Snowflake, el campo items contiene un array de objetos.
El problema es que los arrays no son directamente analizables en formato tabular.
Necesitamos transformarlos.
Cómo funciona FLATTEN
La función FLATTEN permite expandir arrays o estructuras anidadas en múltiples filas.
Esto convierte datos jerárquicos en formato relacional.
Ejemplo:
SELECT
order_data:order_id AS order_id,
item.value:product AS product,
item.value:price AS price
FROM orders,
LATERAL FLATTEN(input => order_data:items) item;
Resultado:
|
order_id |
product |
price |
|
1001 |
Laptop |
1200 |
|
1001 |
Mouse |
50 |
Cada elemento del array se convierte en una fila.
¿Qué es LATERAL FLATTEN?
La sintaxis completa suele incluir:
LATERAL FLATTEN(…)
Esto permite:
- Iterar sobre arrays
- Expandir estructuras
- Generar filas adicionales
LATERAL indica que la función depende de la fila actual.
Columnas generadas por FLATTEN
FLATTEN genera varias columnas útiles:
|
Columna |
Descripción |
|
VALUE |
Elemento actual del array |
|
INDEX |
Posición dentro del array |
|
KEY |
Nombre del campo |
|
PATH |
Ruta dentro del JSON |
|
SEQ |
Identificador interno |
Estas columnas ayudan a navegar estructuras complejas.
Ejemplo práctico completo
Supongamos que tenemos una tabla:
CREATE TABLE raw_orders (
data VARIANT
);
Consulta para expandir items:
SELECT
data:order_id::INTEGER AS order_id,
item.value:product::STRING AS product,
item.value:price::FLOAT AS price
FROM raw_orders,
LATERAL FLATTEN(input => data:items) item;
Observa el uso de:
- ::INTEGER
- ::STRING
- ::FLOAT
Esto convierte tipos correctamente.
FLATTEN con múltiples niveles
JSON complejos pueden tener arrays dentro de arrays.
Ejemplo:
{
«order_id»: 1001,
«items»: [
{
«product»: «Laptop»,
«discounts»: [
{«type»: «promo», «amount»: 50}
]
}
]
}
Podemos aplicar FLATTEN múltiples veces.
Ejemplo:
SELECT
order_data:order_id AS order_id,
item.value:product AS product,
discount.value:type AS discount_type
FROM orders,
LATERAL FLATTEN(input => order_data:items) item,
LATERAL FLATTEN(input => item.value:discounts) discount;
Esto permite navegar estructuras profundamente anidadas.
Uso en pipelines de ingestión
FLATTEN suele utilizarse en etapas de transformación:
- Ingesta de JSON bruto
- Expansión de estructuras
- Normalización en tablas
- Modelado analítico
Esto convierte datos semiestructurados en datasets utilizables.
Ventajas de trabajar con JSON en Snowflake
Snowflake permite:
- Almacenar JSON sin esquema previo
- Consultar datos directamente
- Extraer campos específicos
- Transformar datos gradualmente
Esto facilita ingestión rápida de datos externos.
Buenas prácticas
- Convertir tipos explícitamente (::STRING, ::NUMBER)
- Documentar rutas JSON
- Evitar consultas excesivamente complejas
- Crear tablas transformadas si el JSON es muy grande
- Validar estructura antes de procesar
Errores comunes
- Olvidar LATERAL
- No convertir tipos correctamente
- Usar rutas JSON incorrectas
- Ignorar arrays vacíos
- No optimizar consultas posteriores
Trabajar con JSON requiere precisión.
Conclusión
La función FLATTEN en Snowflake permite transformar estructuras JSON anidadas en formato tabular, facilitando su análisis y procesamiento. En entornos donde los datos provienen de APIs, eventos o sistemas modernos, dominar esta función es fundamental para convertir datos semiestructurados en datasets analíticos.
En arquitecturas modernas de datos, FLATTEN se convierte en una herramienta clave para integrar fuentes flexibles dentro de modelos analíticos estructurados.




