Snowflake MigrationClickHouse Workshops

Superset di ClickHouse

Membangun ulang dashboard di atas ClickHouse: tujuh dataset yang melatih uniqHLL12, quantileTDigest, sampling, window function, dan dictGet, lalu 18 chart di empat dashboard.

Panduan ini menuntun Anda melalui setup manual lengkap untuk seluruh dataset, chart, dan dashboard ClickHouse di Superset. Ikuti panduan ini untuk memahami apa yang dilakukan setiap visualisasi dan bagaimana visualisasi itu dibangun.

Ingin melompat ke depan? Jalankan skrip impor agar semuanya dibuat secara otomatis:

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

Skrip membuat koneksi, lalu mengimpor semua 7 dataset, 18 chart, dan 4 dashboard sekaligus. Gunakan panduan ini sebagai referensi atau untuk membangun ulang bagian tertentu.

Penting — kredensial placeholder di superset/dashboards/dashboard_export_*.zip.

ZIP dashboard yang di-commit memiliki databases/*.yaml yang disunting menjadi placeholder:

sqlalchemy_uri: clickhousedb://default:XXXXXXXXXX@your-instance.clickhouse.cloud:8443/analytics?secure=true
  • Impor otomatis (add_clickhouse_connection.sh) — bekerja apa adanya. Skrip menulis ulang sqlalchemy_uri di dalam ZIP menggunakan ${CLICKHOUSE_HOST} / ${CLICKHOUSE_USER} / ${CLICKHOUSE_PASSWORD} dari .env Anda sebelum mengirimkannya ke endpoint impor, sehingga host placeholder tidak pernah sampai ke Superset.
  • Impor manual melalui UI Superset — database yang diimpor akan dibuat dengan your-instance.clickhouse.cloud dan tidak akan terhubung. Setelah impor, buka Settings → Database Connections → Edit pada entri tersebut dan ganti sqlalchemy_uri dengan URI ClickHouse Cloud Anda yang sebenarnya (mis. clickhousedb://default:<PASSWORD>@<your-host>.clickhouse.cloud:8443/analytics?secure=true).
  • Mengekspor ulang dashboard Anda sendiri — Superset menanamkan host ClickHouse Anda yang sebenarnya ke dalam hasil ekspor. Sebelum meng-commit, sunting host tersebut kembali menjadi your-instance.clickhouse.cloud agar identifier layanan Anda tidak bocor ke riwayat git.

Prasyarat: Lapisan analytics sudah terisi (dbt run dilakukan pada Langkah 7.3) dan dictionary sudah ada (scripts/04_create_dictionary.sql dilakukan pada Langkah 7.4).


Langkah 0 — Daftarkan Koneksi ClickHouse

  1. Masuk ke Superset di http://localhost:8088 (admin / admin).

  2. Buka Settings → Database Connections.

  3. Klik + Database.

  4. Pilih ClickHouse Connect dari daftar.

  5. Isi:

    FieldNilai
    Display NameNYC Taxi — ClickHouse Cloud
    Hosthostname ClickHouse Cloud Anda (dari .clickhouse_state)
    Port8443
    Databaseanalytics
    Usernamedefault
    Passwordpassword ClickHouse Cloud Anda
    SSLaktif
  6. Klik Test Connection — pastikan banner sukses berwarna hijau muncul.

  7. Klik Connect.


Bagian 1 — Buat Dataset

Dataset 1 — fact_trips (dataset tabel)

Dipakai oleh: Operations Command Center, Executive Weekly Report, Driver Quality Analytics, Capabilities Showcase

  1. Buka Datasets → + Dataset.
  2. Setel Database = NYC Taxi — ClickHouse Cloud, Schema = analytics, Table = fact_trips.
  3. Klik Add Dataset and Create Chart → lalu berpindah halaman — dataset sudah tersimpan.

Dataset 2 — agg_hourly_zone_trips (dataset tabel)

Dipakai oleh: Operations Command Center, Executive Weekly Report

  1. Buka Datasets → + Dataset.
  2. Setel Database = NYC Taxi — ClickHouse Cloud, Schema = analytics, Table = agg_hourly_zone_trips.
  3. Klik Save.

Dataset 3 — CH Approx Unique Trips (uniqHLL12) (virtual)

Dipakai oleh: Capabilities Showcase — mendemonstrasikan penghitungan perkiraan uniqHLL12() dibandingkan uniq() yang eksak.

  1. Buka Datasets → + Dataset.
  2. Klik Switch to SQL Lab (atau pilih tab Virtual).
  3. Setel Database = NYC Taxi — ClickHouse Cloud.
  4. Tempelkan 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. Beri nama CH Approx Unique Trips (uniqHLL12) lalu klik Save.

Dataset 4 — CH Cohort Retention (virtual)

Dipakai oleh: Capabilities Showcase — mendemonstrasikan window function (AVG(...) OVER (...)) untuk revenue bergulir menurut borough.

  1. Buka Datasets → + Dataset → Virtual.
  2. Setel Database = NYC Taxi — ClickHouse Cloud.
  3. Tempelkan 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. Beri nama CH Cohort Retention lalu klik Save.

Dataset 5 — CH Fare Percentiles (quantileTDigest) (virtual)

Dipakai oleh: Capabilities Showcase — mendemonstrasikan quantileTDigest() sebagai fungsi persentil native ClickHouse.

  1. Buka Datasets → + Dataset → Virtual.
  2. Setel Database = NYC Taxi — ClickHouse Cloud.
  3. Tempelkan 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. Beri nama CH Fare Percentiles (quantileTDigest) lalu klik Save.

Dataset 6 — CH Sampling Demo (virtual)

Dipakai oleh: Capabilities Showcase — mendemonstrasikan sampling rand() % N dibandingkan full scan, dengan membandingkan akurasinya.

  1. Buka Datasets → + Dataset → Virtual.
  2. Setel Database = NYC Taxi — ClickHouse Cloud.
  3. Tempelkan 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. Beri nama CH Sampling Demo lalu klik Save.

Dataset 7 — CH Zone Dict Lookup (virtual)

Dipakai oleh: Capabilities Showcase — mendemonstrasikan dictGet() untuk pengayaan dimensi tanpa JOIN.

Membutuhkan: dictionary analytics.taxi_zones_dict dari Langkah 7.4 (scripts/04_create_dictionary.sql).

  1. Buka Datasets → + Dataset → Virtual.
  2. Setel Database = NYC Taxi — ClickHouse Cloud.
  3. Tempelkan 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. Beri nama CH Zone Dict Lookup lalu klik Save.

Dataset ini membaca dari default.trips_raw (tabel raw) alih-alih analytics.fact_trips untuk menunjukkan dictionary bekerja di lapisan sumber tanpa pra-pemrosesan apa pun.


Bagian 2 — Buat Chart

Buat chart melalui Charts → + Chart, pilih dataset, pilih tipe chart, konfigurasikan field-nya, lalu Save dengan nama persis seperti yang tercantum.


Dashboard 1 — CH Operations Command Center

Chart: CH Total Trips Today

SetelanNilai
Datasetfact_trips
Chart typeBig Number
MetricCOUNT(trip_id)
Time filterpickup_at = today : now
Subheadertrips today

Simpan sebagai CH Total Trips Today.

Chart: CH Revenue Today

SetelanNilai
Datasetfact_trips
Chart typeBig Number
MetricSUM(fare_amount_usd)
Time filterpickup_at = today : now
Subheaderrevenue today

Simpan sebagai CH Revenue Today.

Chart: CH Trip Volume by Hour (24h)

SetelanNilai
Datasetagg_hourly_zone_trips
Chart typeLine Chart (ECharts)
X-axishour_bucket
MetricSUM(trips)
Time grain1 hour

Simpan sebagai CH Trip Volume by Hour (24h).

Chart: CH Revenue by Zone (Top 10)

SetelanNilai
Datasetagg_hourly_zone_trips
Chart typeBar Chart
Dimensionszone_id
MetricSUM(revenue)
Row limit10
Sort barsaktif

Simpan sebagai CH Revenue by Zone (Top 10).


Dashboard 2 — CH Executive Weekly Report

Chart: CH Daily Revenue (7 days)

SetelanNilai
Datasetfact_trips
Chart typeLine Chart (ECharts)
X-axispickup_at
MetricSUM(fare_amount_usd)
Time grain1 hour

Simpan sebagai CH Daily Revenue (7 days).

Chart: CH Top Zones by Revenue

SetelanNilai
Datasetagg_hourly_zone_trips
Chart typeBar Chart
Dimensionszone_id
MetricSUM(revenue)
Row limit20
Sort barsaktif

Simpan sebagai CH Top Zones by Revenue.

Chart: CH Payment Distribution

SetelanNilai
Datasetfact_trips
Chart typePie Chart
Dimensionspayment_type
MetricCOUNT(trip_id)

Simpan sebagai CH Payment Distribution.

Chart: CH Avg Fare by Vendor

SetelanNilai
Datasetfact_trips
Chart typeBar Chart
Dimensionsvendor_name
MetricAVG(fare_amount_usd)
Row limit20
Sort barsaktif

Simpan sebagai CH Avg Fare by Vendor.


Dashboard 3 — CH Driver Quality Analytics

Chart: CH Rating Distribution

SetelanNilai
Datasetfact_trips
Chart typeBar Chart
Dimensionsdriver_rating
MetricCOUNT(trip_id)
Row limit20
Sort barsaktif

Simpan sebagai CH Rating Distribution.

Chart: CH High-Rated Driver Revenue

SetelanNilai
Datasetfact_trips
Chart typeBig Number
MetricSUM(fare_amount_usd)
Filterdriver_rating >= 4.5
Subheaderrevenue from 4.5+ rated drivers

Simpan sebagai CH High-Rated Driver Revenue.

Chart: CH Avg Fare by Driver Rating

SetelanNilai
Datasetfact_trips
Chart typeBar Chart
Dimensionsdriver_rating
MetricAVG(fare_amount_usd)
Row limit20
Sort barsaktif

Simpan sebagai CH Avg Fare by Driver Rating.

Chart: CH Top Drivers Leaderboard

SetelanNilai
Datasetfact_trips
Chart typeTable
Query modeRaw records
Columnsvendor_name, vehicle_type, driver_rating, fare_amount_usd
Row limit1000

Simpan sebagai CH Top Drivers Leaderboard.


Dashboard 4 — CH Capabilities Showcase

Chart: CH Recent Trips (fact_trips)

SetelanNilai
Datasetfact_trips
Chart typeTable
Query modeRaw records
Columnstrip_id, pickup_at, dropoff_at, fare_amount_usd, pickup_borough, vendor_name
Row limit1000

Simpan sebagai CH Recent Trips (fact_trips).

Chart: CH Fare Percentiles (quantileTDigest)

SetelanNilai
DatasetCH Fare Percentiles (quantileTDigest)
Chart typeTable
Query modeRaw records
Columnsvendor_name, p50_fare, p95_fare, p99_fare, trip_count

Simpan sebagai CH Fare Percentiles (quantileTDigest).

Chart: CH Approx vs Exact Unique Trips (uniqHLL12)

SetelanNilai
DatasetCH Approx Unique Trips (uniqHLL12)
Chart typeTable
Query modeRaw records
Columnsday, exact_unique_trips, approx_unique_trips, pct_error

Simpan sebagai CH Approx vs Exact Unique Trips (uniqHLL12).

Chart: CH Sampling Accuracy Demo (SAMPLE 0.1)

SetelanNilai
DatasetCH Sampling Demo
Chart typeTable
Query modeRaw records
Columnsmethod, trip_count, avg_fare

Simpan sebagai CH Sampling Accuracy Demo (SAMPLE 0.1).

Chart: CH Zone Lookup via Dictionary (dictGet)

SetelanNilai
DatasetCH Zone Dict Lookup
Chart typeTable
Query modeRaw records
Columnsborough, zone, trips, avg_fare

Simpan sebagai CH Zone Lookup via Dictionary (dictGet).

Chart: CH Weekly Revenue Trend (window functions)

SetelanNilai
DatasetCH Cohort Retention
Chart typeTable
Query modeRaw records
Columnsweek, pickup_borough, trips, revenue, rolling_4wk_avg_revenue

Simpan sebagai CH Weekly Revenue Trend (window functions).


Bagian 3 — Rakit Dashboard

Untuk setiap dashboard:

  1. Buka Dashboards → + Dashboard.
  2. Masukkan judulnya.
  3. Klik Save lalu Edit Dashboard.
  4. Dari panel kanan, tarik setiap chart ke kanvas.
  5. Klik Save setelah selesai.

CH — Operations Command Center

Judul: CH — Operations Command Center

BarisChart
Baris 1CH Total Trips Today · CH Revenue Today
Baris 2CH Trip Volume by Hour (24h) · CH Revenue by Zone (Top 10)

CH — Executive Weekly Report

Judul: CH — Executive Weekly Report

BarisChart
Baris 1CH Daily Revenue (7 days) · CH Top Zones by Revenue · CH Payment Distribution · CH Avg Fare by Vendor

CH — Driver Quality Analytics

Judul: CH — Driver Quality Analytics

BarisChart
Baris 1CH Rating Distribution · CH High-Rated Driver Revenue
Baris 2CH Avg Fare by Driver Rating · CH Top Drivers Leaderboard

CH — Capabilities Showcase

Judul: CH — Capabilities Showcase

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

Verifikasi

Setelah menyelesaikan Bagian 3, buka http://localhost:8088. Di bawah Dashboards, Anda seharusnya melihat 7 total — 3 dashboard Snowflake (dari setup Bagian 1) dan 4 dengan awalan CH —.


Penanganan Masalah

fact_trips atau agg_hourly_zone_trips tidak ditemukan Jalankan dbt run terlebih dahulu (Langkah 7.3).

dictGet mengembalikan string kosong Dictionary analytics.taxi_zones_dict belum dibuat. Jalankan scripts/04_create_dictionary.sql (Langkah 7.4).

Dataset virtual tidak mengembalikan baris apa pun Jendela 30 hari / 7 hari pada beberapa query memerlukan data terbaru. Jika data migrasi Anda semuanya historis, ganti filter waktu dengan tanggal tetap:

-- Replace: WHERE pickup_at >= today() - INTERVAL 30 DAY
-- With:    WHERE pickup_at >= '2023-01-01'

Error 403 dari skrip impor Cookie sesi Superset Anda telah kedaluwarsa. Keluar lalu masuk kembali, kemudian jalankan ulang.

Di halaman ini

ID