Superset บน ClickHouse
การสร้าง dashboard ใหม่บน ClickHouse: เจ็ด dataset ที่ใช้งาน uniqHLL12, quantileTDigest, การสุ่มตัวอย่าง, window function และ dictGet แล้วต่อด้วย 18 chart กระจายใน dashboard สี่ชุด
คู่มือนี้พาคุณตั้งค่า dataset, chart และ dashboard ของ ClickHouse ทั้งหมดด้วยมือใน Superset ทำตามคู่มือนี้เพื่อเข้าใจว่าการแสดงผลแต่ละชุดทำอะไรและถูกสร้างขึ้นอย่างไร
ต้องการข้ามไปเลย? รันสคริปต์นำเข้าเพื่อให้ทุกอย่างถูกสร้างให้อัตโนมัติ:
source .env && source .clickhouse_state bash superset/add_clickhouse_connection.shสคริปต์จะสร้างการเชื่อมต่อ นำเข้า dataset ทั้ง 7 ชุด, chart ทั้ง 18 ชุด และ dashboard ทั้ง 4 ชุดในครั้งเดียว ใช้คู่มือนี้เป็นเอกสารอ้างอิงหรือเพื่อสร้างชิ้นส่วนแต่ละชิ้นใหม่
สำคัญ — credential ตัวอย่างใน
superset/dashboards/dashboard_export_*.zipZIP ของ dashboard ที่ commit ไว้มี
databases/*.yamlถูกปิดบังเป็นค่าตัวอย่าง:sqlalchemy_uri: clickhousedb://default:XXXXXXXXXX@your-instance.clickhouse.cloud:8443/analytics?secure=true
- การนำเข้าอัตโนมัติ (
add_clickhouse_connection.sh) — ใช้ได้ทันที สคริปต์จะเขียนsqlalchemy_uriภายใน ZIP ใหม่โดยใช้${CLICKHOUSE_HOST}/${CLICKHOUSE_USER}/${CLICKHOUSE_PASSWORD}จาก.envของคุณ ก่อน ส่งไปที่ endpoint นำเข้า ดังนั้นโฮสต์ตัวอย่างจะไม่ไปถึง Superset เลย- การนำเข้าด้วยมือผ่าน Superset UI — ฐานข้อมูลที่นำเข้าจะถูกสร้างด้วย
your-instance.clickhouse.cloudและเชื่อมต่อไม่ได้ หลังนำเข้า ให้ไปที่ Settings → Database Connections → Edit รายการนั้นและแทนsqlalchemy_uriด้วย URI ของ ClickHouse Cloud จริงของคุณ (เช่นclickhousedb://default:<PASSWORD>@<your-host>.clickhouse.cloud:8443/analytics?secure=true)- การส่งออก dashboard ของคุณเองอีกครั้ง — Superset ฝังโฮสต์ ClickHouse จริงของคุณลงในไฟล์ส่งออก ก่อน commit ให้ปิดบังโฮสต์กลับไปเป็น
your-instance.clickhouse.cloudเพื่อไม่ให้ตัวระบุ service ของคุณรั่วเข้าไปในประวัติ git
สิ่งที่ต้องมีก่อน: ชั้น analytics มีข้อมูลแล้ว (dbt run เสร็จในขั้นที่ 7.3) และ dictionary มีอยู่แล้ว (scripts/04_create_dictionary.sql เสร็จในขั้นที่ 7.4)
ขั้นที่ 0 — ลงทะเบียนการเชื่อมต่อ ClickHouse
-
เข้าสู่ระบบ Superset ที่ http://localhost:8088 (admin / admin)
-
ไปที่ Settings → Database Connections
-
คลิก + Database
-
เลือก ClickHouse Connect จากรายการ
-
กรอกข้อมูล:
ฟิลด์ ค่า Display Name NYC Taxi — ClickHouse CloudHost ชื่อโฮสต์ ClickHouse Cloud ของคุณ (จาก .clickhouse_state)Port 8443Database analyticsUsername defaultPassword รหัสผ่าน ClickHouse Cloud ของคุณ SSL เปิดใช้ -
คลิก Test Connection — ยืนยันแถบแจ้งสำเร็จสีเขียว
-
คลิก Connect
ส่วนที่ 1 — สร้าง Dataset
Dataset 1 — fact_trips (table dataset)
ใช้โดย: Operations Command Center, Executive Weekly Report, Driver Quality Analytics, Capabilities Showcase
- ไปที่ Datasets → + Dataset
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud, Schema =analytics, Table =fact_trips - คลิก Add Dataset and Create Chart → แล้วออกจากหน้านั้น — dataset ถูกบันทึกแล้ว
Dataset 2 — agg_hourly_zone_trips (table dataset)
ใช้โดย: Operations Command Center, Executive Weekly Report
- ไปที่ Datasets → + Dataset
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud, Schema =analytics, Table =agg_hourly_zone_trips - คลิก Save
Dataset 3 — CH Approx Unique Trips (uniqHLL12) (virtual)
ใช้โดย: Capabilities Showcase — สาธิตการนับแบบประมาณด้วย uniqHLL12() เทียบกับ uniq() ที่แม่นยำ
- ไปที่ Datasets → + Dataset
- คลิก Switch to SQL Lab (หรือเลือกแท็บ Virtual)
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud - วาง 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- ตั้งชื่อว่า
CH Approx Unique Trips (uniqHLL12)แล้วคลิก Save
Dataset 4 — CH Cohort Retention (virtual)
ใช้โดย: Capabilities Showcase — สาธิต window function (AVG(...) OVER (...)) สำหรับรายได้เลื่อนแยกตามเขต
- ไปที่ Datasets → + Dataset → Virtual
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud - วาง 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- ตั้งชื่อว่า
CH Cohort Retentionแล้วคลิก Save
Dataset 5 — CH Fare Percentiles (quantileTDigest) (virtual)
ใช้โดย: Capabilities Showcase — สาธิต quantileTDigest() ในฐานะฟังก์ชันเปอร์เซ็นไทล์ที่มีอยู่ใน ClickHouse
- ไปที่ Datasets → + Dataset → Virtual
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud - วาง 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- ตั้งชื่อว่า
CH Fare Percentiles (quantileTDigest)แล้วคลิก Save
Dataset 6 — CH Sampling Demo (virtual)
ใช้โดย: Capabilities Showcase — สาธิตการสุ่มตัวอย่างด้วย rand() % N เทียบกับการสแกนทั้งตาราง โดยเปรียบเทียบความแม่นยำ
- ไปที่ Datasets → + Dataset → Virtual
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud - วาง 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- ตั้งชื่อว่า
CH Sampling Demoแล้วคลิก Save
Dataset 7 — CH Zone Dict Lookup (virtual)
ใช้โดย: Capabilities Showcase — สาธิต dictGet() สำหรับการเพิ่มข้อมูล dimension โดยไม่ต้อง JOIN
ต้องมี: dictionary
analytics.taxi_zones_dictจากขั้นที่ 7.4 (scripts/04_create_dictionary.sql)
- ไปที่ Datasets → + Dataset → Virtual
- ตั้ง Database =
NYC Taxi — ClickHouse Cloud - วาง 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- ตั้งชื่อว่า
CH Zone Dict Lookupแล้วคลิก Save
dataset นี้อ่านจาก
default.trips_raw(ตารางดิบ) แทนanalytics.fact_tripsเพื่อแสดงให้เห็นว่า dictionary ทำงานได้ที่ชั้นต้นทางโดยไม่ต้องประมวลผลล่วงหน้าเลย
ส่วนที่ 2 — สร้าง Chart
สร้าง chart ผ่าน Charts → + Chart เลือก dataset เลือกประเภท chart ตั้งค่าฟิลด์ แล้ว Save ด้วยชื่อที่ระบุไว้ตรงตัว
Dashboard 1 — CH Operations Command Center
Chart: CH Total Trips Today
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Big Number |
| Metric | COUNT(trip_id) |
| Time filter | pickup_at = today : now |
| Subheader | trips today |
บันทึกเป็น CH Total Trips Today
Chart: CH Revenue Today
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Big Number |
| Metric | SUM(fare_amount_usd) |
| Time filter | pickup_at = today : now |
| Subheader | revenue today |
บันทึกเป็น CH Revenue Today
Chart: CH Trip Volume by Hour (24h)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | agg_hourly_zone_trips |
| Chart type | Line Chart (ECharts) |
| X-axis | hour_bucket |
| Metric | SUM(trips) |
| Time grain | 1 hour |
บันทึกเป็น CH Trip Volume by Hour (24h)
Chart: CH Revenue by Zone (Top 10)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | agg_hourly_zone_trips |
| Chart type | Bar Chart |
| Dimensions | zone_id |
| Metric | SUM(revenue) |
| Row limit | 10 |
| Sort bars | เปิดใช้ |
บันทึกเป็น CH Revenue by Zone (Top 10)
Dashboard 2 — CH Executive Weekly Report
Chart: CH Daily Revenue (7 days)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Line Chart (ECharts) |
| X-axis | pickup_at |
| Metric | SUM(fare_amount_usd) |
| Time grain | 1 hour |
บันทึกเป็น CH Daily Revenue (7 days)
Chart: CH Top Zones by Revenue
| การตั้งค่า | ค่า |
|---|---|
| Dataset | agg_hourly_zone_trips |
| Chart type | Bar Chart |
| Dimensions | zone_id |
| Metric | SUM(revenue) |
| Row limit | 20 |
| Sort bars | เปิดใช้ |
บันทึกเป็น CH Top Zones by Revenue
Chart: CH Payment Distribution
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Pie Chart |
| Dimensions | payment_type |
| Metric | COUNT(trip_id) |
บันทึกเป็น CH Payment Distribution
Chart: CH Avg Fare by Vendor
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Bar Chart |
| Dimensions | vendor_name |
| Metric | AVG(fare_amount_usd) |
| Row limit | 20 |
| Sort bars | เปิดใช้ |
บันทึกเป็น CH Avg Fare by Vendor
Dashboard 3 — CH Driver Quality Analytics
Chart: CH Rating Distribution
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Bar Chart |
| Dimensions | driver_rating |
| Metric | COUNT(trip_id) |
| Row limit | 20 |
| Sort bars | เปิดใช้ |
บันทึกเป็น CH Rating Distribution
Chart: CH High-Rated Driver Revenue
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Big Number |
| Metric | SUM(fare_amount_usd) |
| Filter | driver_rating >= 4.5 |
| Subheader | revenue from 4.5+ rated drivers |
บันทึกเป็น CH High-Rated Driver Revenue
Chart: CH Avg Fare by Driver Rating
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Bar Chart |
| Dimensions | driver_rating |
| Metric | AVG(fare_amount_usd) |
| Row limit | 20 |
| Sort bars | เปิดใช้ |
บันทึกเป็น CH Avg Fare by Driver Rating
Chart: CH Top Drivers Leaderboard
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Table |
| Query mode | Raw records |
| Columns | vendor_name, vehicle_type, driver_rating, fare_amount_usd |
| Row limit | 1000 |
บันทึกเป็น CH Top Drivers Leaderboard
Dashboard 4 — CH Capabilities Showcase
Chart: CH Recent Trips (fact_trips)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | fact_trips |
| Chart type | Table |
| Query mode | Raw records |
| Columns | trip_id, pickup_at, dropoff_at, fare_amount_usd, pickup_borough, vendor_name |
| Row limit | 1000 |
บันทึกเป็น CH Recent Trips (fact_trips)
Chart: CH Fare Percentiles (quantileTDigest)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | CH Fare Percentiles (quantileTDigest) |
| Chart type | Table |
| Query mode | Raw records |
| Columns | vendor_name, p50_fare, p95_fare, p99_fare, trip_count |
บันทึกเป็น CH Fare Percentiles (quantileTDigest)
Chart: CH Approx vs Exact Unique Trips (uniqHLL12)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | CH Approx Unique Trips (uniqHLL12) |
| Chart type | Table |
| Query mode | Raw records |
| Columns | day, exact_unique_trips, approx_unique_trips, pct_error |
บันทึกเป็น CH Approx vs Exact Unique Trips (uniqHLL12)
Chart: CH Sampling Accuracy Demo (SAMPLE 0.1)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | CH Sampling Demo |
| Chart type | Table |
| Query mode | Raw records |
| Columns | method, trip_count, avg_fare |
บันทึกเป็น CH Sampling Accuracy Demo (SAMPLE 0.1)
Chart: CH Zone Lookup via Dictionary (dictGet)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | CH Zone Dict Lookup |
| Chart type | Table |
| Query mode | Raw records |
| Columns | borough, zone, trips, avg_fare |
บันทึกเป็น CH Zone Lookup via Dictionary (dictGet)
Chart: CH Weekly Revenue Trend (window functions)
| การตั้งค่า | ค่า |
|---|---|
| Dataset | CH Cohort Retention |
| Chart type | Table |
| Query mode | Raw records |
| Columns | week, pickup_borough, trips, revenue, rolling_4wk_avg_revenue |
บันทึกเป็น CH Weekly Revenue Trend (window functions)
ส่วนที่ 3 — ประกอบ Dashboard
สำหรับแต่ละ dashboard:
- ไปที่ Dashboards → + Dashboard
- ใส่ชื่อ
- คลิก Save แล้ว Edit Dashboard
- จากแผงด้านขวา ลาก chart แต่ละตัวลงบนพื้นที่ทำงาน
- คลิก Save เมื่อเสร็จ
CH — Operations Command Center
ชื่อ: CH — Operations Command Center
| แถว | Charts |
|---|---|
| แถว 1 | CH Total Trips Today · CH Revenue Today |
| แถว 2 | CH Trip Volume by Hour (24h) · CH Revenue by Zone (Top 10) |
CH — Executive Weekly Report
ชื่อ: CH — Executive Weekly Report
| แถว | Charts |
|---|---|
| แถว 1 | CH Daily Revenue (7 days) · CH Top Zones by Revenue · CH Payment Distribution · CH Avg Fare by Vendor |
CH — Driver Quality Analytics
ชื่อ: CH — Driver Quality Analytics
| แถว | Charts |
|---|---|
| แถว 1 | CH Rating Distribution · CH High-Rated Driver Revenue |
| แถว 2 | CH Avg Fare by Driver Rating · CH Top Drivers Leaderboard |
CH — Capabilities Showcase
ชื่อ: CH — Capabilities Showcase
| แถว | Charts |
|---|---|
| แถว 1 | CH Recent Trips (fact_trips) · CH Fare Percentiles (quantileTDigest) |
| แถว 2 | CH Approx vs Exact Unique Trips (uniqHLL12) · CH Sampling Accuracy Demo (SAMPLE 0.1) |
| แถว 3 | CH Zone Lookup via Dictionary (dictGet) · CH Weekly Revenue Trend (window functions) |
การตรวจสอบ
หลังทำส่วนที่ 3 เสร็จ ให้เปิด http://localhost:8088 ใต้ Dashboards คุณควรเห็นทั้งหมด 7 ชุด — dashboard ของ Snowflake 3 ชุด (จากการ setup ใน Part 1) และอีก 4 ชุดที่มีคำนำหน้า CH —
การแก้ปัญหา
ไม่พบ fact_trips หรือ agg_hourly_zone_trips
รัน dbt run ก่อน (ขั้นที่ 7.3)
dictGet คืนค่าเป็นสตริงว่าง
dictionary analytics.taxi_zones_dict ยังไม่ถูกสร้าง รัน scripts/04_create_dictionary.sql (ขั้นที่ 7.4)
Virtual dataset ไม่คืนแถวใดเลย หน้าต่าง 30 วัน / 7 วันใน query บางตัวต้องมีข้อมูลล่าสุด ถ้าข้อมูลการย้ายระบบของคุณเป็นข้อมูลย้อนหลังทั้งหมด ให้แทนตัวกรองเวลาด้วยวันที่คงที่:
-- Replace: WHERE pickup_at >= today() - INTERVAL 30 DAY
-- With: WHERE pickup_at >= '2023-01-01'ข้อผิดพลาด 403 จากสคริปต์นำเข้า cookie เซสชัน Superset ของคุณหมดอายุ ออกจากระบบแล้วเข้าใหม่ จากนั้นรันอีกครั้ง