Snowflake MigrationClickHouse Workshops

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_*.zip

ZIP ของ 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

  1. เข้าสู่ระบบ Superset ที่ http://localhost:8088 (admin / admin)

  2. ไปที่ Settings → Database Connections

  3. คลิก + Database

  4. เลือก ClickHouse Connect จากรายการ

  5. กรอกข้อมูล:

    ฟิลด์ค่า
    Display NameNYC Taxi — ClickHouse Cloud
    Hostชื่อโฮสต์ ClickHouse Cloud ของคุณ (จาก .clickhouse_state)
    Port8443
    Databaseanalytics
    Usernamedefault
    Passwordรหัสผ่าน ClickHouse Cloud ของคุณ
    SSLเปิดใช้
  6. คลิก Test Connection — ยืนยันแถบแจ้งสำเร็จสีเขียว

  7. คลิก Connect


ส่วนที่ 1 — สร้าง Dataset

Dataset 1 — fact_trips (table dataset)

ใช้โดย: Operations Command Center, Executive Weekly Report, Driver Quality Analytics, Capabilities Showcase

  1. ไปที่ Datasets → + Dataset
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud, Schema = analytics, Table = fact_trips
  3. คลิก Add Dataset and Create Chart → แล้วออกจากหน้านั้น — dataset ถูกบันทึกแล้ว

Dataset 2 — agg_hourly_zone_trips (table dataset)

ใช้โดย: Operations Command Center, Executive Weekly Report

  1. ไปที่ Datasets → + Dataset
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud, Schema = analytics, Table = agg_hourly_zone_trips
  3. คลิก Save

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

ใช้โดย: Capabilities Showcase — สาธิตการนับแบบประมาณด้วย uniqHLL12() เทียบกับ uniq() ที่แม่นยำ

  1. ไปที่ Datasets → + Dataset
  2. คลิก Switch to SQL Lab (หรือเลือกแท็บ Virtual)
  3. ตั้ง Database = NYC Taxi — ClickHouse Cloud
  4. วาง 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. ตั้งชื่อว่า CH Approx Unique Trips (uniqHLL12) แล้วคลิก Save

Dataset 4 — CH Cohort Retention (virtual)

ใช้โดย: Capabilities Showcase — สาธิต window function (AVG(...) OVER (...)) สำหรับรายได้เลื่อนแยกตามเขต

  1. ไปที่ Datasets → + Dataset → Virtual
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud
  3. วาง 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. ตั้งชื่อว่า CH Cohort Retention แล้วคลิก Save

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

ใช้โดย: Capabilities Showcase — สาธิต quantileTDigest() ในฐานะฟังก์ชันเปอร์เซ็นไทล์ที่มีอยู่ใน ClickHouse

  1. ไปที่ Datasets → + Dataset → Virtual
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud
  3. วาง 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. ตั้งชื่อว่า CH Fare Percentiles (quantileTDigest) แล้วคลิก Save

Dataset 6 — CH Sampling Demo (virtual)

ใช้โดย: Capabilities Showcase — สาธิตการสุ่มตัวอย่างด้วย rand() % N เทียบกับการสแกนทั้งตาราง โดยเปรียบเทียบความแม่นยำ

  1. ไปที่ Datasets → + Dataset → Virtual
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud
  3. วาง 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. ตั้งชื่อว่า 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)

  1. ไปที่ Datasets → + Dataset → Virtual
  2. ตั้ง Database = NYC Taxi — ClickHouse Cloud
  3. วาง 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. ตั้งชื่อว่า 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

การตั้งค่าค่า
Datasetfact_trips
Chart typeBig Number
MetricCOUNT(trip_id)
Time filterpickup_at = today : now
Subheadertrips today

บันทึกเป็น CH Total Trips Today

Chart: CH Revenue Today

การตั้งค่าค่า
Datasetfact_trips
Chart typeBig Number
MetricSUM(fare_amount_usd)
Time filterpickup_at = today : now
Subheaderrevenue today

บันทึกเป็น CH Revenue Today

Chart: CH Trip Volume by Hour (24h)

การตั้งค่าค่า
Datasetagg_hourly_zone_trips
Chart typeLine Chart (ECharts)
X-axishour_bucket
MetricSUM(trips)
Time grain1 hour

บันทึกเป็น CH Trip Volume by Hour (24h)

Chart: CH Revenue by Zone (Top 10)

การตั้งค่าค่า
Datasetagg_hourly_zone_trips
Chart typeBar Chart
Dimensionszone_id
MetricSUM(revenue)
Row limit10
Sort barsเปิดใช้

บันทึกเป็น CH Revenue by Zone (Top 10)


Dashboard 2 — CH Executive Weekly Report

Chart: CH Daily Revenue (7 days)

การตั้งค่าค่า
Datasetfact_trips
Chart typeLine Chart (ECharts)
X-axispickup_at
MetricSUM(fare_amount_usd)
Time grain1 hour

บันทึกเป็น CH Daily Revenue (7 days)

Chart: CH Top Zones by Revenue

การตั้งค่าค่า
Datasetagg_hourly_zone_trips
Chart typeBar Chart
Dimensionszone_id
MetricSUM(revenue)
Row limit20
Sort barsเปิดใช้

บันทึกเป็น CH Top Zones by Revenue

Chart: CH Payment Distribution

การตั้งค่าค่า
Datasetfact_trips
Chart typePie Chart
Dimensionspayment_type
MetricCOUNT(trip_id)

บันทึกเป็น CH Payment Distribution

Chart: CH Avg Fare by Vendor

การตั้งค่าค่า
Datasetfact_trips
Chart typeBar Chart
Dimensionsvendor_name
MetricAVG(fare_amount_usd)
Row limit20
Sort barsเปิดใช้

บันทึกเป็น CH Avg Fare by Vendor


Dashboard 3 — CH Driver Quality Analytics

Chart: CH Rating Distribution

การตั้งค่าค่า
Datasetfact_trips
Chart typeBar Chart
Dimensionsdriver_rating
MetricCOUNT(trip_id)
Row limit20
Sort barsเปิดใช้

บันทึกเป็น CH Rating Distribution

Chart: CH High-Rated Driver Revenue

การตั้งค่าค่า
Datasetfact_trips
Chart typeBig Number
MetricSUM(fare_amount_usd)
Filterdriver_rating >= 4.5
Subheaderrevenue from 4.5+ rated drivers

บันทึกเป็น CH High-Rated Driver Revenue

Chart: CH Avg Fare by Driver Rating

การตั้งค่าค่า
Datasetfact_trips
Chart typeBar Chart
Dimensionsdriver_rating
MetricAVG(fare_amount_usd)
Row limit20
Sort barsเปิดใช้

บันทึกเป็น CH Avg Fare by Driver Rating

Chart: CH Top Drivers Leaderboard

การตั้งค่าค่า
Datasetfact_trips
Chart typeTable
Query modeRaw records
Columnsvendor_name, vehicle_type, driver_rating, fare_amount_usd
Row limit1000

บันทึกเป็น CH Top Drivers Leaderboard


Dashboard 4 — CH Capabilities Showcase

Chart: CH Recent Trips (fact_trips)

การตั้งค่าค่า
Datasetfact_trips
Chart typeTable
Query modeRaw records
Columnstrip_id, pickup_at, dropoff_at, fare_amount_usd, pickup_borough, vendor_name
Row limit1000

บันทึกเป็น CH Recent Trips (fact_trips)

Chart: CH Fare Percentiles (quantileTDigest)

การตั้งค่าค่า
DatasetCH Fare Percentiles (quantileTDigest)
Chart typeTable
Query modeRaw records
Columnsvendor_name, p50_fare, p95_fare, p99_fare, trip_count

บันทึกเป็น CH Fare Percentiles (quantileTDigest)

Chart: CH Approx vs Exact Unique Trips (uniqHLL12)

การตั้งค่าค่า
DatasetCH Approx Unique Trips (uniqHLL12)
Chart typeTable
Query modeRaw records
Columnsday, exact_unique_trips, approx_unique_trips, pct_error

บันทึกเป็น CH Approx vs Exact Unique Trips (uniqHLL12)

Chart: CH Sampling Accuracy Demo (SAMPLE 0.1)

การตั้งค่าค่า
DatasetCH Sampling Demo
Chart typeTable
Query modeRaw records
Columnsmethod, trip_count, avg_fare

บันทึกเป็น CH Sampling Accuracy Demo (SAMPLE 0.1)

Chart: CH Zone Lookup via Dictionary (dictGet)

การตั้งค่าค่า
DatasetCH Zone Dict Lookup
Chart typeTable
Query modeRaw records
Columnsborough, zone, trips, avg_fare

บันทึกเป็น CH Zone Lookup via Dictionary (dictGet)

Chart: CH Weekly Revenue Trend (window functions)

การตั้งค่าค่า
DatasetCH Cohort Retention
Chart typeTable
Query modeRaw records
Columnsweek, pickup_borough, trips, revenue, rolling_4wk_avg_revenue

บันทึกเป็น CH Weekly Revenue Trend (window functions)


ส่วนที่ 3 — ประกอบ Dashboard

สำหรับแต่ละ dashboard:

  1. ไปที่ Dashboards → + Dashboard
  2. ใส่ชื่อ
  3. คลิก Save แล้ว Edit Dashboard
  4. จากแผงด้านขวา ลาก chart แต่ละตัวลงบนพื้นที่ทำงาน
  5. คลิก Save เมื่อเสร็จ

CH — Operations Command Center

ชื่อ: CH — Operations Command Center

แถวCharts
แถว 1CH Total Trips Today · CH Revenue Today
แถว 2CH Trip Volume by Hour (24h) · CH Revenue by Zone (Top 10)

CH — Executive Weekly Report

ชื่อ: CH — Executive Weekly Report

แถวCharts
แถว 1CH 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
แถว 1CH Rating Distribution · CH High-Rated Driver Revenue
แถว 2CH Avg Fare by Driver Rating · CH Top Drivers Leaderboard

CH — Capabilities Showcase

ชื่อ: CH — Capabilities Showcase

แถวCharts
แถว 1CH Recent Trips (fact_trips) · CH Fare Percentiles (quantileTDigest)
แถว 2CH Approx vs Exact Unique Trips (uniqHLL12) · CH Sampling Accuracy Demo (SAMPLE 0.1)
แถว 3CH 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 ของคุณหมดอายุ ออกจากระบบแล้วเข้าใหม่ จากนั้นรันอีกครั้ง

ในหน้านี้

ขั้นที่ 0 — ลงทะเบียนการเชื่อมต่อ ClickHouseส่วนที่ 1 — สร้าง DatasetDataset 1 — fact_trips (table dataset)Dataset 2 — agg_hourly_zone_trips (table dataset)Dataset 3 — CH Approx Unique Trips (uniqHLL12) (virtual)Dataset 4 — CH Cohort Retention (virtual)Dataset 5 — CH Fare Percentiles (quantileTDigest) (virtual)Dataset 6 — CH Sampling Demo (virtual)Dataset 7 — CH Zone Dict Lookup (virtual)ส่วนที่ 2 — สร้าง ChartDashboard 1 — CH Operations Command CenterChart: CH Total Trips TodayChart: CH Revenue TodayChart: CH Trip Volume by Hour (24h)Chart: CH Revenue by Zone (Top 10)Dashboard 2 — CH Executive Weekly ReportChart: CH Daily Revenue (7 days)Chart: CH Top Zones by RevenueChart: CH Payment DistributionChart: CH Avg Fare by VendorDashboard 3 — CH Driver Quality AnalyticsChart: CH Rating DistributionChart: CH High-Rated Driver RevenueChart: CH Avg Fare by Driver RatingChart: CH Top Drivers LeaderboardDashboard 4 — CH Capabilities ShowcaseChart: CH Recent Trips (fact_trips)Chart: CH Fare Percentiles (quantileTDigest)Chart: CH Approx vs Exact Unique Trips (uniqHLL12)Chart: CH Sampling Accuracy Demo (SAMPLE 0.1)Chart: CH Zone Lookup via Dictionary (dictGet)Chart: CH Weekly Revenue Trend (window functions)ส่วนที่ 3 — ประกอบ DashboardCH — Operations Command CenterCH — Executive Weekly ReportCH — Driver Quality AnalyticsCH — Capabilities Showcaseการตรวจสอบการแก้ปัญหา
TH