Cómo reconstruir los paneles sobre ClickHouse: siete conjuntos de datos que ejercitan uniqHLL12, quantileTDigest, muestreo, funciones de ventana y dictGet, y después 18 gráficos repartidos en cuatro paneles.
Esta guía explica la configuración manual completa de todos los conjuntos de datos,
gráficos y paneles de ClickHouse en Superset. Síguela para entender qué hace cada
visualización y cómo se construye.
¿Quieres saltarte el trabajo manual? Ejecuta el script de importación para crearlo
todo automáticamente:
El script crea de una vez la conexión, los 7 conjuntos, los 18 gráficos y los 4
paneles. Usa esta guía como referencia o para reconstruir piezas individuales.
Importante: credenciales de marcador en superset/dashboards/dashboard_export_*.zip.
El ZIP de paneles incluido tiene los archivos databases/*.yaml anonimizados:
Importación automática (add_clickhouse_connection.sh): funciona sin cambios.
Antes de llamar al endpoint de importación, el script reescribe sqlalchemy_uri
dentro del ZIP con ${CLICKHOUSE_HOST} / ${CLICKHOUSE_USER} /
${CLICKHOUSE_PASSWORD} de tu .env, por lo que el host de marcador nunca llega a
Superset.
Importación manual mediante la interfaz de Superset: la base importada se crea
con your-instance.clickhouse.cloud y no se conecta. Tras importar, ve a
Settings → Database Connections → Edit y sustituye sqlalchemy_uri por tu URI
real de ClickHouse Cloud (por ejemplo,
clickhousedb://default:<PASSWORD>@<your-host>.clickhouse.cloud:8443/analytics?secure=true).
Volver a exportar tus paneles: Superset incorpora el host real de ClickHouse en
la exportación. Antes de incluirla, anonimiza el host de nuevo como
your-instance.clickhouse.cloud para que el identificador del servicio no se filtre
al historial de git.
Requisitos previos: la capa analítica está poblada (dbt run completado en el Paso
7.3) y existe el diccionario (scripts/04_create_dictionary.sql completado en el Paso
7.4).
Usado por: Capabilities Showcase; demuestra el recuento aproximado uniqHLL12() frente
al exacto uniq().
Ve a Datasets → + Dataset.
Haz clic en Switch to SQL Lab (o selecciona la pestaña Virtual).
Define Database = NYC Taxi — ClickHouse Cloud.
Pega el SQL:
SELECT toDate(pickup_at) AS day, uniq(trip_id) AS exact_unique_trips, uniqHLL12(trip_id) AS approx_unique_trips, round( abs(uniq(trip_id) - uniqHLL12(trip_id)) / uniq(trip_id) * 100, 2 ) AS pct_errorFROM analytics.fact_trips FINALWHERE pickup_at >= today() - INTERVAL 30 DAYGROUP BY dayORDER BY day
Ponle CH Approx Unique Trips (uniqHLL12) y haz clic en Save.
Usado por: Capabilities Showcase; demuestra funciones de ventana
(AVG(...) OVER (...)) para ingresos móviles por distrito.
Ve a Datasets → + Dataset → Virtual.
Define Database = NYC Taxi — ClickHouse Cloud.
Pega el SQL:
SELECT week, pickup_borough, trips, revenue, round(avg(revenue) OVER ( PARTITION BY pickup_borough ORDER BY week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW ), 2) AS rolling_4wk_avg_revenueFROM ( SELECT toStartOfWeek(pickup_at) AS week, pickup_borough, count() AS trips, round(sum(fare_amount_usd), 2) AS revenue FROM analytics.fact_trips FINAL GROUP BY week, pickup_borough)ORDER BY week DESC, revenue DESCLIMIT 100
Usado por: Capabilities Showcase; demuestra quantileTDigest() como función nativa de
percentiles de ClickHouse.
Ve a Datasets → + Dataset → Virtual.
Define Database = NYC Taxi — ClickHouse Cloud.
Pega el SQL:
SELECT vendor_name, quantileTDigest(0.5)(fare_amount_usd) AS p50_fare, quantileTDigest(0.95)(fare_amount_usd) AS p95_fare, quantileTDigest(0.99)(fare_amount_usd) AS p99_fare, count() AS trip_countFROM analytics.fact_trips FINALGROUP BY vendor_nameORDER BY vendor_name
Ponle CH Fare Percentiles (quantileTDigest) y haz clic en Save.
Usado por: Capabilities Showcase; demuestra dictGet() para enriquecer dimensiones sin JOIN.
Requiere: el diccionario analytics.taxi_zones_dict del Paso 7.4
(scripts/04_create_dictionary.sql).
Ve a Datasets → + Dataset → Virtual.
Define Database = NYC Taxi — ClickHouse Cloud.
Pega el SQL:
SELECT dictGet('analytics.taxi_zones_dict', 'borough', toUInt16(pickup_location_id)) AS borough, dictGet('analytics.taxi_zones_dict', 'zone', toUInt16(pickup_location_id)) AS zone, count() AS trips, round(avg(fare_amount_usd), 2) AS avg_fareFROM default.trips_rawWHERE pickup_at >= today() - INTERVAL 7 DAYGROUP BY borough, zoneORDER BY trips DESC
Ponle CH Zone Dict Lookup y haz clic en Save.
Este conjunto lee de default.trips_raw (tabla sin procesar), no de
analytics.fact_trips, para mostrar el diccionario funcionando en la capa de origen
sin ningún preprocesamiento.
Tras completar la Parte 3, abre http://localhost:8088. En
Dashboards debes ver 7 en total: 3 de Snowflake (de la configuración de la Parte 1)
y 4 con el prefijo CH —.
No se encuentra fact_trips o agg_hourly_zone_trips
Ejecuta primero dbt run (Paso 7.3).
dictGet devuelve cadenas vacías
No se ha creado el diccionario analytics.taxi_zones_dict. Ejecuta
scripts/04_create_dictionary.sql (Paso 7.4).
El conjunto virtual no devuelve filas
La ventana de 30/7 días de algunas consultas requiere datos recientes. Si todos los
datos migrados son históricos, sustituye el filtro temporal por una fecha fija:
-- Replace: WHERE pickup_at >= today() - INTERVAL 30 DAY-- With: WHERE pickup_at >= '2023-01-01'
Error 403 del script de importación
La cookie de sesión de Superset ha caducado. Cierra sesión, vuelve a iniciarla y ejecuta
de nuevo el script.