Data Team TigoTrino 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.
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;
| 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 |
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á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 |
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;
| 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 |
| 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 |
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;
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;
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']
);
| 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 |
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;
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 |
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'
);