Dựng lại các dashboard trên ClickHouse: bảy dataset khai thác uniqHLL12, quantileTDigest, sampling, window function và dictGet, rồi 18 chart trên bốn dashboard.
Hướng dẫn này đi qua toàn bộ quá trình thiết lập thủ công mọi dataset, chart và dashboard ClickHouse trong Superset. Hãy theo nó để hiểu mỗi biểu đồ làm gì và được dựng ra sao.
Muốn bỏ qua để đi nhanh? Chạy script import để mọi thứ được tạo tự động:
Script tạo kết nối, import toàn bộ 7 dataset, 18 chart và 4 dashboard trong một lần. Hãy dùng hướng dẫn này như tài liệu tham khảo hoặc để dựng lại từng phần riêng lẻ.
Quan trọng — thông tin đăng nhập giả trong superset/dashboards/dashboard_export_*.zip.
ZIP dashboard đã commit có databases/*.yaml bị che thành giá trị giả:
Auto-import (add_clickhouse_connection.sh) — hoạt động nguyên trạng. Script ghi lại sqlalchemy_uri bên trong ZIP bằng ${CLICKHOUSE_HOST} / ${CLICKHOUSE_USER} / ${CLICKHOUSE_PASSWORD} từ .env của bạn trước khi gửi tới endpoint import, nên host giả không bao giờ tới được Superset.
Import thủ công qua Superset UI — database được import sẽ được tạo với your-instance.clickhouse.cloud và sẽ không kết nối được. Sau khi import, vào Settings → Database Connections → Edit mục đó và thay sqlalchemy_uri bằng URI ClickHouse Cloud thật của bạn (ví dụ clickhousedb://default:<PASSWORD>@<your-host>.clickhouse.cloud:8443/analytics?secure=true).
Xuất lại dashboard của riêng bạn — Superset nhúng host ClickHouse thật của bạn vào bản export. Trước khi commit, hãy che host trở về your-instance.clickhouse.cloud để định danh service của bạn không lọt vào git history.
Điều kiện tiên quyết: Tầng analytics đã có dữ liệu (dbt run đã xong ở Bước 7.3) và dictionary đã tồn tại (scripts/04_create_dictionary.sql đã xong ở Bước 7.4).
Được dùng bởi: Capabilities Showcase — minh họa phép đếm gần đúng uniqHLL12() so với uniq() chính xác.
Vào Datasets → + Dataset.
Bấm Switch to SQL Lab (hoặc chọn tab Virtual).
Đặt Database = NYC Taxi — ClickHouse Cloud.
Dán 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
Đặt tên nó là CH Approx Unique Trips (uniqHLL12) và bấm Save.
Được dùng bởi: Capabilities Showcase — minh họa window function (AVG(...) OVER (...)) cho doanh thu trượt theo borough.
Vào Datasets → + Dataset → Virtual.
Đặt Database = NYC Taxi — ClickHouse Cloud.
Dán 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
Được dùng bởi: Capabilities Showcase — minh họa quantileTDigest() như một hàm phân vị native của ClickHouse.
Vào Datasets → + Dataset → Virtual.
Đặt Database = NYC Taxi — ClickHouse Cloud.
Dán 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
Đặt tên nó là CH Fare Percentiles (quantileTDigest) và bấm Save.
Được dùng bởi: Capabilities Showcase — minh họa dictGet() để làm giàu dimension mà không cần JOIN.
Yêu cầu: dictionary analytics.taxi_zones_dict từ Bước 7.4 (scripts/04_create_dictionary.sql).
Vào Datasets → + Dataset → Virtual.
Đặt Database = NYC Taxi — ClickHouse Cloud.
Dán 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
Đặt tên nó là CH Zone Dict Lookup và bấm Save.
Dataset này đọc từ default.trips_raw (bảng thô) thay vì analytics.fact_trips để cho thấy dictionary hoạt động ngay ở tầng nguồn mà không cần bất kỳ tiền xử lý nào.
Sau khi hoàn thành Phần 3, hãy mở http://localhost:8088. Dưới Dashboards, bạn sẽ thấy tổng cộng 7 — 3 dashboard Snowflake (từ phần setup ở Phần 1) và 4 dashboard có tiền tố CH —.
Không tìm thấy fact_trips hoặc agg_hourly_zone_trips
Hãy chạy dbt run trước (Bước 7.3).
dictGet trả về chuỗi rỗng
Dictionary analytics.taxi_zones_dict chưa được tạo. Hãy chạy scripts/04_create_dictionary.sql (Bước 7.4).
Virtual dataset không trả về dòng nào
Cửa sổ 30 ngày / 7 ngày trong một số truy vấn đòi hỏi dữ liệu gần đây. Nếu dữ liệu di trú của bạn hoàn toàn là dữ liệu lịch sử, hãy thay bộ lọc thời gian bằng một mốc ngày cố định:
-- Replace: WHERE pickup_at >= today() - INTERVAL 30 DAY-- With: WHERE pickup_at >= '2023-01-01'
Lỗi 403 từ script import
Cookie phiên Superset của bạn đã hết hạn. Hãy đăng xuất rồi đăng nhập lại, sau đó chạy lại.