Trino

Trino es el motor SQL distribuido del Consumption Layer de TIGO. Permite consultar datos en múltiples fuentes (S3/Ceph, PostgreSQL, Hive, Kafka) con un solo query SQL estándar.

#Getting Started

#Conectarse al cluster Trino (TIGO)

Conexión vía CLI (trino CLI)

$ trino --server https://trino.tigo.internal:8443 \
        --user tu_usuario \
        --password \
        --catalog hive \
        --schema analytics

Verificar versión y conexión

trino> SELECT version();
trino> SHOW catalogs;
trino> SHOW schemas FROM hive;

#Parámetros de conexión CLI

Opción Ejemplo Descripción
--server --server https://trino.tigo.internal:8443 URL del coordinator
--user --user jperez Tu usuario TIGO
--password --password Solicitar password interactivo
--catalog --catalog hive Catálogo por defecto
--schema --schema analytics Schema por defecto
--output-format --output-format CSV_HEADER Formato de salida
--execute --execute "SELECT 1" Ejecutar query sin entrar al CLI
--file --file query.sql Ejecutar desde archivo
--debug --debug Mostrar info de debugging

#Explorando Catálogos y Schemas

#Comandos de exploración

Listar catálogos disponibles

SHOW CATALOGS;

Listar schemas de un catálogo

SHOW SCHEMAS FROM hive;
SHOW SCHEMAS FROM postgresql;

Listar tablas de un schema

SHOW TABLES FROM hive.analytics;

Describir la estructura de una tabla

DESCRIBE hive.analytics.ventas;
SHOW COLUMNS FROM hive.analytics.ventas;

Ver estadísticas de una tabla

SHOW STATS FOR hive.analytics.ventas;

#Catálogos disponibles en TIGO

Catálogo Fuente de datos Uso principal
hive Ceph/S3 (Parquet, ORC) Data Lake principal
postgresql PostgreSQL Bases transaccionales
kafka Apache Kafka Streaming / datos en tiempo real
tpch Datos de prueba Benchmarking y testing

#SQL en Trino

#Queries básicas

Query con catálogo y schema completo

SELECT *
FROM hive.analytics.ventas
WHERE fecha = DATE '2026-03-01'
LIMIT 100;

Cambiar schema actual en sesión

USE hive.analytics;
SELECT COUNT(*) FROM ventas;

Join entre catálogos (cross-catalog query)

SELECT
    v.cliente_id,
    c.nombre,
    c.pais,
    SUM(v.monto) AS total
FROM hive.analytics.ventas v
JOIN postgresql.crm.clientes c
    ON v.cliente_id = c.id
WHERE v.fecha >= DATE '2026-01-01'
GROUP BY 1, 2, 3
ORDER BY total DESC;

#Funciones de fecha y tiempo

Función Resultado / Uso
CURRENT_DATE Fecha actual
CURRENT_TIMESTAMP Timestamp actual
DATE_TRUNC('month', fecha) Primer día del mes
DATE_ADD('day', 7, fecha) Sumar 7 días
DATE_DIFF('day', f1, f2) Diferencia en días
YEAR(fecha) Extraer año
FORMAT_DATETIME(ts, 'yyyy-MM') Formatear timestamp
FROM_UNIXTIME(epoch) Convertir Unix timestamp

#Funciones de cadena

Función Descripción
LOWER(str) / UPPER(str) Minúsculas / Mayúsculas
TRIM(str) Quitar espacios
SUBSTR(str, pos, len) Subcadena
CONCAT(a, b) Concatenar
SPLIT(str, delim) Dividir en array
REGEXP_LIKE(str, pattern) Coincidencia regex
REGEXP_EXTRACT(str, pattern) Extraer con regex
STRPOS(str, substr) Posición de substring

#Funciones Avanzadas

#Window Functions

Ranking por país

SELECT
    pais,
    categoria,
    ingresos,
    RANK() OVER (PARTITION BY pais ORDER BY ingresos DESC) AS ranking,
    ROW_NUMBER() OVER (PARTITION BY pais ORDER BY ingresos DESC) AS row_num,
    SUM(ingresos) OVER (PARTITION BY pais) AS total_pais
FROM hive.analytics.ventas_mensuales;

Cálculo rolling (ventana deslizante)

SELECT
    fecha,
    revenue,
    AVG(revenue) OVER (
        ORDER BY fecha
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    ) AS avg_7_dias
FROM hive.analytics.metricas_diarias;

#Trabajando con Arrays y JSON

Explotar un array

SELECT cliente_id, producto
FROM hive.analytics.ordenes,
UNNEST(productos_comprados) AS t(producto);

Extraer campos de JSON

SELECT
    JSON_EXTRACT_SCALAR(metadata, '$.pais') AS pais,
    JSON_EXTRACT_SCALAR(metadata, '$.canal') AS canal,
    CAST(JSON_EXTRACT_SCALAR(metadata, '$.monto') AS DOUBLE) AS monto
FROM hive.raw.eventos;

#DDL y Gestión de Tablas

Crear tabla externa (apuntando a Ceph)

CREATE TABLE hive.analytics.mi_tabla (
    id BIGINT,
    nombre VARCHAR,
    fecha DATE,
    monto DOUBLE
)
WITH (
    format = 'PARQUET',
    external_location = 's3a://tigo-data-analytics/mi_tabla/',
    partitioned_by = ARRAY['fecha']
);

Crear tabla como resultado de query (CTAS)

CREATE TABLE hive.analytics.resumen_ventas
WITH (
    format = 'PARQUET',
    partitioned_by = ARRAY['pais']
)
AS
SELECT
    pais,
    DATE_TRUNC('month', fecha) AS mes,
    SUM(monto) AS total_ventas
FROM hive.analytics.ventas
GROUP BY 1, 2;

Añadir partición manualmente

CALL system.create_empty_partition(
    schema_name => 'analytics',
    table_name  => 'mi_tabla',
    partition_columns => ARRAY['fecha'],
    partition_values  => ARRAY['2026-03-01']
);

#Performance y Optimización

#Tips de performance

Práctica Descripción
Filtrar por partición Siempre incluir columna de partición en WHERE
Preferir Parquet/ORC Formatos columnar mucho más rápidos que CSV
Usar stats actualizadas ANALYZE TABLE después de grandes inserciones
Evitar SELECT * Seleccionar solo columnas necesarias
Usar APPROX_DISTINCT(col) Más rápido que COUNT(DISTINCT col) en grandes sets
Limitar joins cross-catalog Son más lentos que joins en el mismo catálogo

#Explain y análisis de queries

Ver plan de ejecución

EXPLAIN SELECT * FROM hive.analytics.ventas WHERE pais = 'CO';

Ver plan con estadísticas estimadas

EXPLAIN (TYPE DISTRIBUTED)
SELECT pais, COUNT(*) FROM hive.analytics.ventas GROUP BY pais;

Ver estadísticas de ejecución de la última query

SHOW STATS FOR hive.analytics.ventas;

#Trino UI y Monitoreo

#Trino Web UI

Acceder a la interfaz de monitoreo

http://trino.tigo.internal:8080/ui/

Filtrar queries en la UI

Filtro Descripción
RUNNING Queries en ejecución ahora
QUEUED En cola esperando recursos
FINISHED Completadas exitosamente
FAILED Fallidas (ver error en detalle)
BLOCKED Bloqueadas por memoria u otros

#Killing queries largas

Obtener query ID desde la UI, luego:

-- En el CLI de Trino
CALL system.runtime.kill_query(
    query_id => '20260311_123456_00001_xxxxx',
    message  => 'Query demasiado larga - cancelada por admin'
);