A imagem do Superset foi personalizada para incluir os drivers do Snowflake e do
ClickHouse. Use --build na primeira execução para que o Docker a crie:
cd "$(git rev-parse --show-toplevel)/workshop_public/snowflake_migration_lab/01-setup-snowflake/superset"source ../.envdocker compose up -d --build
Todos os gráficos usam conjuntos de dados virtuais — consultas SQL salvas com um nome.
Como criar cada conjunto de dados:
Acesse Datasets → + Dataset
Selecione o banco de dados: NYC Taxi — Snowflake (Source)
Clique em Create dataset from SQL query e cole o SQL abaixo
Salve com o nome indicado
Depois de salvar: acesse Datasets → ícone de lápis → guia Columns → "Sync columns from source" → Save. Sem essa etapa, o editor de gráficos mostrará 0 colunas.
SELECT DATE_TRUNC('hour', pickup_at) AS hour_bucket, pickup_borough, COUNT(*) AS trip_count, SUM(total_amount_usd) AS total_revenue, AVG(tip_amount_usd / NULLIF(fare_amount_usd, 0)) AS avg_tip_rate, AVG(trip_distance_miles) AS avg_distance_milesFROM ANALYTICS.FACT_TRIPSWHERE pickup_at >= DATEADD('day', -7, CURRENT_TIMESTAMP()) AND pickup_borough IS NOT NULLGROUP BY 1, 2ORDER BY 1 DESC, total_revenue DESC
SELECT pickup_at::DATE AS trip_date, COUNT(*) AS daily_trip_count, AVG(trip_distance_miles) AS daily_avg_distance, AVG(AVG(trip_distance_miles)) OVER ( ORDER BY pickup_at::DATE ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS rolling_7d_avg_distance, SUM(total_amount_usd) AS daily_revenue, SUM(SUM(total_amount_usd)) OVER ( ORDER BY pickup_at::DATE ROWS BETWEEN 6 PRECEDING AND CURRENT ROW ) AS rolling_7d_revenueFROM ANALYTICS.FACT_TRIPSGROUP BY 1ORDER BY 1 DESCLIMIT 365
SELECT CASE WHEN surge_multiplier >= 2.0 THEN 'High Surge (2x+)' WHEN surge_multiplier >= 1.5 THEN 'Medium Surge (1.5–2x)' WHEN surge_multiplier > 1.0 THEN 'Low Surge (1–1.5x)' ELSE 'No Surge (1x)' END AS surge_category, COUNT(*) AS trip_count, ROUND(AVG(total_amount_usd), 2) AS avg_total_fare, ROUND(AVG(fare_amount_usd), 2) AS avg_base_fare, ROUND(AVG(surge_multiplier), 2) AS avg_surgeFROM ANALYTICS.FACT_TRIPSWHERE surge_multiplier IS NOT NULLGROUP BY 1ORDER BY avg_surge DESC
Esquema: RAW ← altere este valor ao criar o conjunto de dados
Consulta RAW.TRIPS_RAW diretamente por meio da sintaxe de caminho com dois-pontos de
VARIANT. Essa é a consulta intencionalmente lenta — o destino do benchmark no
ClickHouse.
SELECT ROUND(TRIP_METADATA:driver.rating::FLOAT, 1) AS rating_bucket, COUNT(*) AS trip_count, ROUND(AVG(TOTAL_AMOUNT), 2) AS avg_fare, ROUND(AVG(DATEDIFF('minute', PICKUP_DATETIME, DROPOFF_DATETIME)), 1) AS avg_duration_minutesFROM RAW.TRIPS_RAWWHERE TRIP_METADATA:driver IS NOT NULL AND TRIP_METADATA:driver.rating IS NOT NULLGROUP BY 1ORDER BY 1
SELECT vehicle_type, COUNT(*) AS trip_count, SUM(total_amount_usd) AS total_revenue, AVG(total_amount_usd) AS avg_fare, AVG(trip_distance_miles) AS avg_distanceFROM ANALYTICS.FACT_TRIPSWHERE vehicle_type IS NOT NULLGROUP BY 1ORDER BY total_revenue DESC
SELECT traffic_level, COUNT(*) AS trip_count, AVG(duration_minutes) AS avg_duration_minutes, AVG(trip_distance_miles) AS avg_distance_miles, AVG(total_amount_usd) AS avg_fareFROM ANALYTICS.FACT_TRIPSWHERE traffic_level IS NOT NULLGROUP BY 1ORDER BY avg_duration_minutes DESC
SELECT pickup_at::DATE AS trip_date, app_platform, COUNT(*) AS trip_count, AVG(surge_multiplier) AS avg_surgeFROM ANALYTICS.FACT_TRIPSWHERE app_platform IS NOT NULL AND pickup_at >= DATEADD('day', -30, CURRENT_TIMESTAMP())GROUP BY 1, 2ORDER BY 1 DESC
[ Total Trips — Big Number ] [ Total Revenue — Big Number (add 2nd) ][ Trips per Hour — Line chart (full width) ][ Revenue by Borough — Bar ] [ Payment Type Split — Pie ][ Borough Performance — Table (full width) ]
Finalidade: visão estratégica para a análise semanal do negócio. Demonstra funções
de janela e a sintaxe específica do Snowflake (QUALIFY), que precisa ser reescrita no
ClickHouse.
Finalidade: análise detalhada do desempenho dos motoristas e da qualidade das
corridas. É intencionalmente o dashboard mais lento — consulta RAW.TRIPS_RAW
diretamente por meio do acesso VARIANT. Registre aqui o tempo da consulta como referência
para o benchmark de desempenho do ClickHouse na Parte 2.
[ Trip Count by Rating — Bar ] [ Avg Fare by Rating — Line ][ Revenue by Vehicle Type — Horizontal bar (full width) ][ Traffic Level Impact — Bar (50%) ] [ Surge by Platform — Table (50%)][ Daily Trips by Platform — Line chart (full width) ]
Abra cada dashboard e confirme que todos os gráficos são carregados sem erros
Para o dashboard 3, anote o tempo de execução da consulta dqa_rating_dist em Snowflake UI → Activity → Query History — guarde-o como benchmark da migração
Importação automática (./init_superset.sh) — funciona sem alterações. Antes da importação, o script registra a conexão real do Snowflake com os valores de .env e, após cada importação, reaplica a URI correta (veja _update_db em init_superset.sh); assim, os valores de exemplo são substituídos por suas credenciais reais.
Importação manual pela interface do Superset — o banco importado será criado com a URI de exemplo e não conseguirá se conectar. Após a importação, acesse Settings → Database Connections → Edit e substitua sqlalchemy_uri pela URI real do Snowflake (por exemplo, snowflake://<USER>:<PASSWORD>@<ORG>-<ACCOUNT>/NYC_TAXI_DB/ANALYTICS?role=ANALYST_ROLE&warehouse=ANALYTICS_WH).
Nova exportação de seus próprios dashboards — durante a exportação, o Superset incorpora o localizador da conta e o nome de usuário em databases/*.yaml. Antes de fazer commit dos ZIPs exportados novamente, substitua esses valores por MYORG-MYACCOUNT / LAB_USER, para que os identificadores da conta não vazem para o histórico do Git.