Snowflake MigrationClickHouse Workshops

Superset en ClickHouse

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:

source .env && source .clickhouse_state
bash superset/add_clickhouse_connection.sh

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:

sqlalchemy_uri: clickhousedb://default:XXXXXXXXXX@your-instance.clickhouse.cloud:8443/analytics?secure=true
  • 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).


Paso 0: registrar la conexión de ClickHouse

  1. Inicia sesión en Superset en http://localhost:8088 (admin / admin).

  2. Ve a Settings → Database Connections.

  3. Haz clic en + Database.

  4. Selecciona ClickHouse Connect en la lista.

  5. Rellena:

    CampoValor
    Display NameNYC Taxi — ClickHouse Cloud
    Hosttu nombre de host de ClickHouse Cloud (de .clickhouse_state)
    Port8443
    Databaseanalytics
    Usernamedefault
    Passwordtu contraseña de ClickHouse Cloud
    SSLactivado
  6. Haz clic en Test Connection y confirma que aparece el indicador verde de éxito.

  7. Haz clic en Connect.


Parte 1: crear conjuntos de datos

Conjunto 1: fact_trips (tabla)

Usado por: Operations Command Center, Executive Weekly Report, Driver Quality Analytics y Capabilities Showcase

  1. Ve a Datasets → + Dataset.
  2. Define Database = NYC Taxi — ClickHouse Cloud, Schema = analytics y Table = fact_trips.
  3. Haz clic en Add Dataset and Create Chart y sal de la página; el conjunto queda guardado.

Conjunto 2: agg_hourly_zone_trips (tabla)

Usado por: Operations Command Center y Executive Weekly Report

  1. Ve a Datasets → + Dataset.
  2. Define Database = NYC Taxi — ClickHouse Cloud, Schema = analytics y Table = agg_hourly_zone_trips.
  3. Haz clic en Save.

Conjunto 3: CH Approx Unique Trips (uniqHLL12) (virtual)

Usado por: Capabilities Showcase; demuestra el recuento aproximado uniqHLL12() frente al exacto uniq().

  1. Ve a Datasets → + Dataset.
  2. Haz clic en Switch to SQL Lab (o selecciona la pestaña Virtual).
  3. Define Database = NYC Taxi — ClickHouse Cloud.
  4. 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_error
FROM analytics.fact_trips FINAL
WHERE pickup_at >= today() - INTERVAL 30 DAY
GROUP BY day
ORDER BY day
  1. Ponle CH Approx Unique Trips (uniqHLL12) y haz clic en Save.

Conjunto 4: CH Cohort Retention (virtual)

Usado por: Capabilities Showcase; demuestra funciones de ventana (AVG(...) OVER (...)) para ingresos móviles por distrito.

  1. Ve a Datasets → + Dataset → Virtual.
  2. Define Database = NYC Taxi — ClickHouse Cloud.
  3. 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_revenue
FROM (
  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 DESC
LIMIT 100
  1. Ponle CH Cohort Retention y haz clic en Save.

Conjunto 5: CH Fare Percentiles (quantileTDigest) (virtual)

Usado por: Capabilities Showcase; demuestra quantileTDigest() como función nativa de percentiles de ClickHouse.

  1. Ve a Datasets → + Dataset → Virtual.
  2. Define Database = NYC Taxi — ClickHouse Cloud.
  3. 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_count
FROM analytics.fact_trips FINAL
GROUP BY vendor_name
ORDER BY vendor_name
  1. Ponle CH Fare Percentiles (quantileTDigest) y haz clic en Save.

Conjunto 6: CH Sampling Demo (virtual)

Usado por: Capabilities Showcase; demuestra el muestreo rand() % N frente a un recorrido completo y compara la precisión.

  1. Ve a Datasets → + Dataset → Virtual.
  2. Define Database = NYC Taxi — ClickHouse Cloud.
  3. Pega el SQL:
SELECT
  'Full Scan'              AS method,
  count()                  AS trip_count,
  round(avg(fare_amount_usd), 4) AS avg_fare
FROM analytics.fact_trips FINAL
UNION ALL
SELECT
  '~10% (rand() % 10 = 0)' AS method,
  count() * 10              AS trip_count_est,
  round(avg(fare_amount_usd), 4) AS avg_fare
FROM analytics.fact_trips FINAL
WHERE rand() % 10 = 0
  1. Ponle CH Sampling Demo y haz clic en Save.

Conjunto 7: CH Zone Dict Lookup (virtual)

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).

  1. Ve a Datasets → + Dataset → Virtual.
  2. Define Database = NYC Taxi — ClickHouse Cloud.
  3. 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_fare
FROM default.trips_raw
WHERE pickup_at >= today() - INTERVAL 7 DAY
GROUP BY borough, zone
ORDER BY trips DESC
  1. 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.


Parte 2: crear gráficos

Crea los gráficos desde Charts → + Chart: selecciona el conjunto, elige el tipo, configura los campos y pulsa Save con el nombre exacto indicado.


Panel 1: CH Operations Command Center

Gráfico: CH Total Trips Today

AjusteValor
Conjuntofact_trips
Tipo de gráficoBig Number
MétricaCOUNT(trip_id)
Filtro temporalpickup_at = today : now
Subtítulotrips today

Guárdalo como CH Total Trips Today.

Gráfico: CH Revenue Today

AjusteValor
Conjuntofact_trips
Tipo de gráficoBig Number
MétricaSUM(fare_amount_usd)
Filtro temporalpickup_at = today : now
Subtítulorevenue today

Guárdalo como CH Revenue Today.

Gráfico: CH Trip Volume by Hour (24h)

AjusteValor
Conjuntoagg_hourly_zone_trips
Tipo de gráficoLine Chart (ECharts)
Eje Xhour_bucket
MétricaSUM(trips)
Granularidad temporal1 hora

Guárdalo como CH Trip Volume by Hour (24h).

Gráfico: CH Revenue by Zone (Top 10)

AjusteValor
Conjuntoagg_hourly_zone_trips
Tipo de gráficoBar Chart
Dimensioneszone_id
MétricaSUM(revenue)
Límite de filas10
Ordenar barrasactivado

Guárdalo como CH Revenue by Zone (Top 10).


Panel 2: CH Executive Weekly Report

Gráfico: CH Daily Revenue (7 days)

AjusteValor
Conjuntofact_trips
Tipo de gráficoLine Chart (ECharts)
Eje Xpickup_at
MétricaSUM(fare_amount_usd)
Granularidad temporal1 hora

Guárdalo como CH Daily Revenue (7 days).

Gráfico: CH Top Zones by Revenue

AjusteValor
Conjuntoagg_hourly_zone_trips
Tipo de gráficoBar Chart
Dimensioneszone_id
MétricaSUM(revenue)
Límite de filas20
Ordenar barrasactivado

Guárdalo como CH Top Zones by Revenue.

Gráfico: CH Payment Distribution

AjusteValor
Conjuntofact_trips
Tipo de gráficoPie Chart
Dimensionespayment_type
MétricaCOUNT(trip_id)

Guárdalo como CH Payment Distribution.

Gráfico: CH Avg Fare by Vendor

AjusteValor
Conjuntofact_trips
Tipo de gráficoBar Chart
Dimensionesvendor_name
MétricaAVG(fare_amount_usd)
Límite de filas20
Ordenar barrasactivado

Guárdalo como CH Avg Fare by Vendor.


Panel 3: CH Driver Quality Analytics

Gráfico: CH Rating Distribution

AjusteValor
Conjuntofact_trips
Tipo de gráficoBar Chart
Dimensionesdriver_rating
MétricaCOUNT(trip_id)
Límite de filas20
Ordenar barrasactivado

Guárdalo como CH Rating Distribution.

Gráfico: CH High-Rated Driver Revenue

AjusteValor
Conjuntofact_trips
Tipo de gráficoBig Number
MétricaSUM(fare_amount_usd)
Filtrodriver_rating >= 4.5
Subtítulorevenue from 4.5+ rated drivers

Guárdalo como CH High-Rated Driver Revenue.

Gráfico: CH Avg Fare by Driver Rating

AjusteValor
Conjuntofact_trips
Tipo de gráficoBar Chart
Dimensionesdriver_rating
MétricaAVG(fare_amount_usd)
Límite de filas20
Ordenar barrasactivado

Guárdalo como CH Avg Fare by Driver Rating.

Gráfico: CH Top Drivers Leaderboard

AjusteValor
Conjuntofact_trips
Tipo de gráficoTable
Modo de consultaRaw records
Columnasvendor_name, vehicle_type, driver_rating, fare_amount_usd
Límite de filas1000

Guárdalo como CH Top Drivers Leaderboard.


Panel 4: CH Capabilities Showcase

Gráfico: CH Recent Trips (fact_trips)

AjusteValor
Conjuntofact_trips
Tipo de gráficoTable
Modo de consultaRaw records
Columnastrip_id, pickup_at, dropoff_at, fare_amount_usd, pickup_borough, vendor_name
Límite de filas1000

Guárdalo como CH Recent Trips (fact_trips).

Gráfico: CH Fare Percentiles (quantileTDigest)

AjusteValor
ConjuntoCH Fare Percentiles (quantileTDigest)
Tipo de gráficoTable
Modo de consultaRaw records
Columnasvendor_name, p50_fare, p95_fare, p99_fare, trip_count

Guárdalo como CH Fare Percentiles (quantileTDigest).

Gráfico: CH Approx vs Exact Unique Trips (uniqHLL12)

AjusteValor
ConjuntoCH Approx Unique Trips (uniqHLL12)
Tipo de gráficoTable
Modo de consultaRaw records
Columnasday, exact_unique_trips, approx_unique_trips, pct_error

Guárdalo como CH Approx vs Exact Unique Trips (uniqHLL12).

Gráfico: CH Sampling Accuracy Demo (SAMPLE 0.1)

AjusteValor
ConjuntoCH Sampling Demo
Tipo de gráficoTable
Modo de consultaRaw records
Columnasmethod, trip_count, avg_fare

Guárdalo como CH Sampling Accuracy Demo (SAMPLE 0.1).

Gráfico: CH Zone Lookup via Dictionary (dictGet)

AjusteValor
ConjuntoCH Zone Dict Lookup
Tipo de gráficoTable
Modo de consultaRaw records
Columnasborough, zone, trips, avg_fare

Guárdalo como CH Zone Lookup via Dictionary (dictGet).

Gráfico: CH Weekly Revenue Trend (window functions)

AjusteValor
ConjuntoCH Cohort Retention
Tipo de gráficoTable
Modo de consultaRaw records
Columnasweek, pickup_borough, trips, revenue, rolling_4wk_avg_revenue

Guárdalo como CH Weekly Revenue Trend (window functions).


Parte 3: montar los paneles

Para cada panel:

  1. Ve a Dashboards → + Dashboard.
  2. Introduce el título.
  3. Haz clic en Save y después en Edit Dashboard.
  4. Arrastra cada gráfico desde el panel derecho al lienzo.
  5. Haz clic en Save al terminar.

CH — Operations Command Center

Título: CH — Operations Command Center

FilaGráficos
Fila 1CH Total Trips Today · CH Revenue Today
Fila 2CH Trip Volume by Hour (24h) · CH Revenue by Zone (Top 10)

CH — Executive Weekly Report

Título: CH — Executive Weekly Report

FilaGráficos
Fila 1CH Daily Revenue (7 days) · CH Top Zones by Revenue · CH Payment Distribution · CH Avg Fare by Vendor

CH — Driver Quality Analytics

Título: CH — Driver Quality Analytics

FilaGráficos
Fila 1CH Rating Distribution · CH High-Rated Driver Revenue
Fila 2CH Avg Fare by Driver Rating · CH Top Drivers Leaderboard

CH — Capabilities Showcase

Título: CH — Capabilities Showcase

FilaGráficos
Fila 1CH Recent Trips (fact_trips) · CH Fare Percentiles (quantileTDigest)
Fila 2CH Approx vs Exact Unique Trips (uniqHLL12) · CH Sampling Accuracy Demo (SAMPLE 0.1)
Fila 3CH Zone Lookup via Dictionary (dictGet) · CH Weekly Revenue Trend (window functions)

Verificación

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 —.


Solución de problemas

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.

En esta página

ES